qt下利用libpcap进行包分析解析示例

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

工程为名为: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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九江在天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值