WinPcap编程(二)
这一次具体讲抓包的两种方法。
不过说明之前得知道几点:
第一,无线网卡的包需要特定网卡驱动才能抓到。
第二,抓以太网上的包的时候,需要禁用无线网卡。(这一点没搞清楚原因,有了解的希望能给个答案,解个惑。感谢。回学校了问问老师。)
第三,(建议)清除ARP表,最好自己写个批处理命令。快一点。
1.0 抓包步骤
步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到达你选择的适配器位置 --> 打开设备 --> 开始抓包。
每一个步骤都是一个函数。了解步骤,后面就好办。
首先,了解一个数据类型pcap/pcap_t。它代表一个打开的设备,理解成它就是适配器就行(实际上是这个适配器的描述符)。这个结构体对用户来说是不透明的,它通过wpcap.dll提供的函数,维护了它的内容。
然后,跳转至你的设备在WinPcap编程(一)中存在,就不多说。
之后,打开设备的函数:
pcap_t* pcap_open ( const char * source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth * auth, char * errbuf )
View Code备注:
第一个参数:source是我们所要打开的设备。当我们获取所有的设备之后,这个source就是d->name。不能为NULL。
第二个参数:snaplen是我们抓取的数据包的大小,100就是抓取整个数据包的前100B,65536最大,把整个包都包括了。
第三个参数:flags设置为混杂模式(PCAP_OPENFLAG_PROMISCUOUS ),即不管数据包是否给我,我都去捕获。这样可以捕捉局域网内所有的包。
第四个参数: read_timeout设置超时时间,以毫秒计(1s=1000ms)。在适配器上进行读取数据操作的时候,不管网络上有没有包,都会在 read_timeout这个时间内响应。
设置为0意味着没有超时。没有数据包到达,读操作将永远不会返回。
设置成-1,无论有没有数据包到达,读操作都会立即返回。
第五个参数:auth远程机登录信息,若本地则为NULL;
第六个参数:errbuf 出错信息。
1.1抓包的两种方式:
1.1.1 回调函数的方法进行抓包
每次抓到包就用回调函数进行处理。处理完接着抓包(如果设置了num的话)。
抓包函数:
int pcap_loop ( pcap_t * p, int cnt, pcap_handler callback, u_char * user )
View Code备注0:
第一个参数:P即是打开的设备。
第二个参数:cnt表示捕捉个数。
第三个参数:回调函数指针。对捕捉的数据包进行操作 。
第四个参数:用户信息,一般为NULL。
函数返回值:
返回值为0,捕捉了cnt次,正常返回。
返回值为-1,发生错误。
返回值为-2,使用pcap_breakloop()结束循环。
回调函数抓包还有一种方法, pcap_dispatch() 。
区别是: pcap_ dispatch() 当超时时间到了(timeout expires)就返回 (尽管不能保证) ,而 pcap_loop() 不会因此而返回,,只有当 cnt 数据包被捕获。
所以,pcap_loop()会在一小段时间内,阻塞网络的利用。pcap_dispatch() 函数一般用于比较复杂的程序中。
1.1.2 不利用回调函数
回调函数比较好,但是有时候需要不用回调函数的方法,特别在多线程里面。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68391.html