工程为名为:pcap_work
该示例可以在win10_x86、麒麟V10_arm_华为擎云9000L、麒麟V10_x86、麒麟V4_arm_飞腾2000上运行。
可以根据过滤器,抓取过滤arp、udp、tcp、icmp数据包。
由于系统限制,包最大每次抓包最大长度为1518字节,建议自定义的基于udp的通信协议包不要超过1450字节,这样的话,通过udp传输数据,就不会分片,可以用libpcap直接抓包,不用后期组包处理数据。
libpcap个人认为主要用于udp高密度数据传输,可以做到零丢包。
pcap_work.pro文件内容如下:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
packetAnalyze.c \
callback.c
HEADERS += \
callback.h \
head.h
contains(QT_ARCH,arm64){
message("compile linux arm 64-bit")
#引入并行编程模块
QMAKE_CXXFLAGS += -fopenmp
LIBS += -fopenmp
CONFIG(release, debug|release){
LIBS += -L$$PWD/lib/linux/arm -lZLToolKit
} else {
LIBS += -L$$PWD/lib/linux/arm -lZLToolKitd
}
# QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib\'"
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib/\':\'\$$ORIGIN/lib/linux/arm/\':\'/usr/local/lib/\'"
# QMAKE_LFLAGS += "-Wl,-rpath=/usr/lib -symbolic"
LIBS += -L$$PWD/lib/linux/arm/ -lpcap
INCLUDEPATH += $$PWD/include/pcap_linux_include
DEPENDPATH += $$PWD/include/pcap_linux_include
PRE_TARGETDEPS += $$PWD/lib/linux/arm/libpcap.a
}
contains(QT_ARCH,x86_64)
{
win32: {
#判断是否windows,msvc 静态连接zltoolkit
message("compile win x86 64-bit")
#引入并行编程模块
QMAKE_CXXFLAGS+= -openmp
CONFIG(release, debug|release){
LIBS += -L$$PWD/lib/windows -lZLToolKit
} else {
LIBS += -L$$PWD/lib/windows -lZLToolKitd
}
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib/\':\'\$$ORIGIN/lib/windows/\'"
#pcap捕获网卡数据
INCLUDEPATH += $$PWD/include/pcap_windows_include
DEPENDPATH += $$PWD/include/pcap_windows_include
LIBS += -L$$PWD/lib/windows/pcap/x64 -lPacket
LIBS += -L$$PWD/lib/windows/pcap/x64 -lwpcap
}
unix: {
message("compile linux x86 64-bit")
#引入并行编程模块
QMAKE_CXXFLAGS += -fopenmp
LIBS += -fopenmp
CONFIG(release, debug|release){
LIBS += -L$$PWD/lib/linux/x86 -lZLToolKit
} else {
LIBS += -L$$PWD/lib/linux/x86 -lZLToolKit
PRE_TARGETDEPS += $$PWD/lib/linux/x86/libZLToolKit.a
}
# QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib\'"
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib/\':\'\$$ORIGIN/lib/linux/x86/\':\'/usr/local/lib/\'"
# QMAKE_LFLAGS += "-Wl,-rpath=/usr/lib -symbolic"
LIBS += -L$$PWD/lib/linux/x86/ -lpcap
INCLUDEPATH += $$PWD/include/pcap_linux_include
DEPENDPATH += $$PWD/include/pcap_linux_include
PRE_TARGETDEPS += $$PWD/lib/linux/x86/libpcap.a
}
}
下面是 头文件 head.h
/******************************************************************************
文 件 名 : head.h
版 本 号 : V1.1
负 责 人 : yz
生成日期 : 2023年9月27日
最近修改 :
文件描述 : 报文头部结构体
函数列表 :
修改历史 :
1.日 期 : 2023年9月27日
作 者 : yz
修改内容 : 创建文件
******************************************************************************/
#ifndef _HEAD_H_
#define _HEAD_H_
#include<sys/types.h>
//#include<netinet/in.h>
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned short uint16_t;
/*最大抓包长度 :Ethernet 1500字节 + 以太网帧头部14字节 + 以太网帧尾部4字节*/
#define SNAP_LEN 1518
/*ethernet head are exactly 14 bytes*/
#define ETHERNET_HEAD_SIZE 14
/*ip头部字节数宏 取hlv低四位即头部长度*单位4bytes 然后强转为ip结构体*/
//#define IP_HEAD_SIZE(ipheader) ((ipheader->ip_hlv & 0x0f) * 4)
#define IP_HEAD_SIZE(packet) ((((struct ip *)(packet + ETHERNET_HEAD_SIZE))->ip_hlv & 0x0f) * 4)
/*ethernet address are 6 bytes*/
#define ETHERNET_ADDR_LEN 6
/*ip address are 4 bytes*/
#define IP_ADDR_LEN 4
#define ARP_REQUEST 1
#define ARP_REPLY 2
/*TCP flag*/
#define TCP_FIN 0x01
#define TCP_SYN 0x02
#define TCP_RST 0x04
#define TCP_PUSH 0x08
#define TCP_ACK 0x10
#define TCP_URG 0x20
#define TCP_ECE 0x40
#define TCP_CWR 0x80
/*Ethernet HEADER*/
struct ethernet
{
u_char ether_dhost[ETHERNET_ADDR_LEN];
u_char ether_shost[ETHERNET_ADDR_LEN];
u_short ether_type; //IP?ARP?etc
};
/*IP HEADER*/
struct

博客介绍了名为pcap_work的工程,该示例可在多种系统上运行,能根据过滤器抓取arp、udp、tcp、icmp数据包。因系统限制,抓包最大长度为1518字节,建议udp协议包不超1450字节,libpcap适用于udp高密度数据传输,还给出了源码相关文件。
最低0.47元/天 解锁文章
1160

被折叠的 条评论
为什么被折叠?



