主机流量采集(二)

使用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函数可以不用回调函数抓取数据包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值