[笔记] libpcap编译及使用

简介: [笔记] libpcap编译及使用

前言

官网

libpcap库安装

环境:

centos 7.9

安装编译

libpcap 下载

tar -zxvf libpcap-1.10.4
cd libpcap-1.10.4 
./configure
make && make install

./configure 时 报错:Neither flex nor lex was found

yum install flex lex

libpcap库使用

https://www.tcpdump.org/pcap.html

此处实现的是抓tcp syn包

#include <iostream>
#include <pcap.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/ether.h>
void packetHandler(unsigned char* userData, const struct pcap_pkthdr* pkthdr, const unsigned char* packetData) {
    struct ethhdr* ethHeader = (struct ethhdr*)packetData;
    if (ntohs(ethHeader->h_proto) == ETH_P_IP) {
        struct iphdr* ipHeader = (struct iphdr*)(packetData + sizeof(struct ethhdr));
        if (ipHeader->protocol == IPPROTO_TCP) {
            struct tcphdr* tcpHeader = (struct tcphdr*)(packetData + sizeof(struct ethhdr) + ipHeader->ihl * 4);
            if (tcpHeader->syn) {
                char source_ip[INET_ADDRSTRLEN];
                char dest_ip[INET_ADDRSTRLEN];
                inet_ntop(AF_INET, &ipHeader->saddr, source_ip, INET_ADDRSTRLEN);
                inet_ntop(AF_INET, &ipHeader->daddr, dest_ip, INET_ADDRSTRLEN);
                printf("Received TCP SYN packet from %s:%u to %s:%u\n",
                        source_ip, ntohs(tcpHeader->source),
                        dest_ip, ntohs(tcpHeader->dest));
            }
        }
    }
}
int main2(int argc, char *argv[])
{
  char *dev, errbuf[PCAP_ERRBUF_SIZE];
  dev = pcap_lookupdev(errbuf);
  if (dev == NULL) {
    fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
    return(2);
  }
  printf("Device: %s\n", dev);
  return(0);
}
int main3() {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_if_t* alldevs;
    pcap_if_t* device;
    // 获取系统上的所有网络设备
    if (pcap_findalldevs(&alldevs, errbuf) == -1) {
        std::cerr << "Error finding devices: " << errbuf << std::endl;
        return 1;
    }
    // 遍历并打印设备列表
    int deviceCount = 0;
    for (device = alldevs; device != nullptr; device = device->next) {
        deviceCount++;
        std::cout << "Device " << deviceCount << ": " << device->name << std::endl;
        if (device->description)
            std::cout << "    Description: " << device->description << std::endl;
        else
            std::cout << "    Description: N/A" << std::endl;
    }
    // 释放设备列表
    pcap_freealldevs(alldevs);
    return 0;
}
int main() {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* handle;
    // 打开网络设备或捕获文件,这里使用默认网络设备 "eth0",你需要根据实际情况修改
    handle = pcap_open_live("ens33", BUFSIZ, 1, 1000, errbuf);
    if (handle == nullptr) {
        std::cerr << "Error opening device: " << errbuf << std::endl;
        return 1;
    }
    // 开始捕获数据包,packetHandler 是回调函数,每捕获一个数据包都会调用它
    if (pcap_loop(handle, 0, packetHandler, nullptr) < 0) {
        std::cerr << "Error in pcap_loop" << std::endl;
        return 1;
    }
    // 关闭捕获会话
    pcap_close(handle);
    return 0;
}

注意:

使用vscode,c++ debug时 链接pcap库 g++执行加“-lpcap“

并且 加 “-std=gnu++0x” 避免c++11特性不支持报错

总结

以上就是今天要讲的内容,本文仅仅简单介绍了libpcap安装和使用。

参考:

libpcap库使用

libpcap简单使用


相关文章
|
监控 安全 中间件
深入浅出vsomeip:打造高效车载通信系统
深入浅出vsomeip:打造高效车载通信系统
2280 0
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
8723 4
|
Ubuntu Linux
在Linux中如何解压 .xz 和 tar.xz 文件?
【4月更文挑战第17天】
9465 6
在Linux中如何解压 .xz 和 tar.xz 文件?
|
Ubuntu Linux 编译器
openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
2273 0
|
11月前
|
安全 算法 API
OpenSSL支持哪些加密算法?
【10月更文挑战第4天】OpenSSL支持哪些加密算法?
810 5
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
347 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
6月前
|
监控 Java 测试技术
2025年Postman的五大替代工具
Postman虽是广受青睐的API测试工具,但仍存在协作功能有限、执行限制及语言支持单一等问题。为此,本文推荐10款强大替代工具,如Apipost、Rapid、Insomnia、Swagger UI和SoapUI等。这些工具各具特色,涵盖轻量级调试、跨平台兼容、自动化测试及负载测试等功能,满足不同用户需求。选择适合的工具,可显著提升API开发与测试效率。
|
存储 编译器 API
高性能收发原始数据包的框架(Netmap)
高性能收发原始数据包的框架(Netmap)
425 1
|
Ubuntu 安全 网络协议
|
Ubuntu 编译器 C++
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
3132 1