使用winPCAP抓取数据包的步骤为:
(1)获取网络适配器列表,使用的函数为pcap_findalldevs函数或者pcap_findalldevs_ex函数,调用后将得到一条保存所有适配器节点的指向该链表的链头指针,用这个指针即可遍历所有的网络适配器。
(2)打开某一指定名字的网络适配器,使用的函数为pcap_open,该函数会返回一个句柄指针,用于作为pcap_loop函数或其它抓取数据包函数的参数。这些函数都有一个回调函数作为函数参数,用于在抓取到数据包时自动调用。
(3)接下来就是在回调函数里(如果是使用回调函数抓取的话)解析抓取到的数据包。
函数说明:
pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)有两个参数,第一个是pcap_if_t指针对象的地址,因此在该函数里改变将会影响到这个指针的值,最后得到的链表的链头地址就保存在该变量里,第二个参数是错误信息缓冲区,如果调用该函数失败,那么就会将错误信息保存在该变量里。可以先清空errbuf(errbuf[0]='\0')然后调用该函数在看errbuf是否长度为0,以判断是否有错误产生。
pcap_findalldevs_ex函数与pcap_findalldevs函数功能基本一样,不过前者可以获取到远程主机的网络适配器信息,但此时程序需要加入#include <remote-ext.h>,否则会产生编译错误。
与这两个函数对应的是pcap_freealldevs(pcap_if_t **alldevsp),如果不在需要获取到的网络适配器信息,就应该调用这个函数释放先前获得的网络适配器列表
pcap_t *pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf)用于打开某一指定名字的网络适配器,该函数返回一个pcap_t指针,用于pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)作为第一个参数,第三个需要一个回调函数指针,该回调函数声明为void NetworkCap::packetCallback(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data),每次当抓取到数据包时就会自动调用该回调函数,其中数据包的大部分信息都保存在pkt_data指向的内存区域中。
pcap_dispatch (pcap_t *p, int cnt, pcap_handler callback, u_char *user)函数与pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)函数的区别,前者在超时会立即返回(即使没有抓取到数据包),而后者只有在抓取到数据包时才会返回。
提示:使用pcap_next_ex函数可以不用回调函数抓取数据包。