引言
项目中根据需求要增加抓包模块,win平台下自然就用到了winpcap。
同时提供了按大小存或按时间存储的接口,并在外层控制存储数量。效果如下:
配置
- 在官网下载安装包和开发包
- 配置VS2012:
- 项目→属性→配置属性→C/C++→常规,右侧的“附加包含库目录”中添加开发包解压后的WpdPack的Include目录;
- 项目→属性→配置属性→C/C++→预处理器,右侧的“预处理器定义”加上WPCAP,HAVE_REMOTE,WIN32;
- 项目→属性→配置属性→链接器→常规,右侧的“附加库目录”中添加开发包解压后的WpdPack的lib目录;
- 项目→属性→配置属性→链接器→输入,右侧的“附加依赖项”中添加wpcap.lib和Packet.lib,ws2_32.lib。
使用
- 线程中实现基础的抓包并保存功能,见代码
- 其他高级应用,如过滤等,参考引用文章
#ifndef THREADPCAP_H
#define THREADPCAP_H
#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"ws2_32.lib")
#include <pcap.h>
#include <QString>
#include <QThread>
typedef struct _DEVInfo{
QString name;
QString description;
QString familyName; //协议族,
QString address; //主机ip
QString netmask; //子网掩码
}DEVInfo;
// 将字节序ip地址转为点分十进制的字符串地址,并获取
inline char *my_iptos(u_long in);
/* 定义了QThread 的子类 PcapThread */
class ThreadPcap:public QThread
{
Q_OBJECT
public:
ThreadPcap(QObject *parent=0);
~ThreadPcap();
u_char hexStr2UChar(QString hexS);
// Windows Socket 初始化
void winSocketInit();
// 扫描本机所有的适配器,并获取每个适配器的信息
QVector<DEVInfo> findAllDev();
// 打开一个适配器
void openLiveDev(const char *);
// 打开一个堆文件
void openDump(QString);
// 捕获数据包函数
void run();
// 停止抓包
void stop();
// 设置保存模式
void setSaveMode(int,int);
// 重新开始按时间存文件
void reStartSavePeriod();
signals:
void signal_creatPcapFile(QString);//各个变量的变化发送到GUI线程
protected:
pcap_t * m_handle;
pcap_if_t *alldevs;
pcap_dumper_t *dumpfp;
private:
pcap_pkthdr* pHeader_;
const u_char * pPktdata_; //数据包
int res;
bool scanIsFinished;
bool m_bSaveTimeup;
int m_nSaveMode;//保存模式,0按大小KB保存,1按大小MB保存,2按时间s保存
int m_nSaveSizeNum;//按大小保存时,单包的大小
};
#endif // THREADPCAP_H