开发环境准备:
1、安装 WinPcap_4_1_3.exe 驱动
2、WinPcap开发包
3、QT6开发环境
4、参考博客:https://www.cnblogs.com/blacksword/archive/2012/03/10/2388848.html
第一步、配置QT环境
1、 如果你的程序使用了WinPcap的远程捕获功能,那么在预处理定义中加入HAVE_REMOTE。不要直接把remote-ext.h直接加入到你的源文件中去,就是说它的作用相当于是包含了remote-ext.h这个头文件,至于为何不直接把这个头文件包含起来
第二步、测试代码:
#include "pcap.h" #include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); pcap_if_t *alldevs; pcap_if_t *d; int i = 0; char errbuf[PCAP_ERRBUF_SIZE]; /* 获取本地机器设备列表 */ if (pcap_findalldevs_ex((char *)PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) { fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1); } /* 打印列表 */ for (d = alldevs; d != NULL; d = d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if (i == 0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return 1; } /* 不再需要设备列表了,释放它 */ pcap_freealldevs(alldevs); return a.exec(); }
1、结构体指针pcap_if_t*的声明,转到pcap_if_t的声明处我们看到在"pcap.h"中有一句 typedef struct pcap_if pcap_if_t;
pcap_if这个结构体是用来做什么的呢?查看文档我们不难发现,它包含了一个适配器的详细信息,其中的数据域name和description表示一个适配器名称和一个可以让人们理解的描述。而之所以定义结构体指针,因为其实定义的是pcap_if结构的链表。链表我们是再熟悉不过了!接下去分析,PCAP_ERRBUF_SIZE是宏定义的,值为256。然后我们看到了pcap_findalldevs_ex这么一个函数,函数的功能就是返回一个pcap_if结构的链表。函数的完整声明如下所示:
int pcap_findalldevs_ex ( char * source,
struct pcap_rmtauth * auth,
pcap_if_t ** alldevs,
char * errbuf
)
2、第一个参数是一个字符指针,保存的是source的地址,事实上它决定了source的类型(file, remote/local interface),而PCAP_SRC_IF_STRING表示用户希望从一个网络接口卡打开捕获(open a capture from a network interface)。
第二个参数是一个pcap_rmtauth的结构体指针,它保存了RPCAP连接远程用户的验证信息,因为是要获取本地的设备列表,这个参数就没有意义,置为NULL。
第三个参数刚才已经说了,这个函数的功能就是返回一个pcap_if结构的链表,给的是链表的地址,所以在源码中看到写的是“&alldevs”。
第四个参数是错误信息缓冲,就是说如果这个函数调用出错则把错误信息保存到这个buff里面。
pcap_findalldevs_ex函数的返回值为0,说明everything is fine,返回-1则表示出错。
接下来的代码就没什么好说的了。但注意最后有一个pcap_freealldevs的函数,它的功能显而易见,就是释放链表的空间咯!
最后看一下在本机运行后的结果。显示的是本机连接的设备信息,当然我们看到设备的名称都是以rpcap://打头的,其实就是源码中用到的PCAP_SRC_IF_STRING,这应该是RPCAP协议所定义的格式,这里就不深究了。
第三步、运行结果:
可以看到有6个设备和我电脑的网络设备个数一致。
0.0分
1 人评分