首先,我们从winpcap的环境配置中可能出现的错误开始。
winpcap开发环境需要是windows操作系统,而且必须安装winpcap驱动才可以调试您的程序。
如果您的程序调试出现类式如下问题:can't find wpcap.dll.............等找不到动态链接库的毛病,请先下载安装winpcap
如果编译的时候出现Cannot open include file: 'pcap.h': No such file or directory等类式找不到文件的错误,请察看是否加入了winpcap开发包的include文件夹。VC6下的加入方法是Tools->options->Directories里面加入下载的winpcap开发包解压以后的include文件夹.
如果链接的时候出现fatal error LNK1104: cannot open file "wpcap.lib"等问题,请察看是否加入了winpcap开发包的lib文件夹.VC6下的加入方法是Tools->options->Directories的lib里面加入下载的winpcap开发包解压以后的lib文件夹.
如果链接的时候出现error LNK2001: unresolved external symbol _pcap_findalldevs等问题,请察看link中是否加入了wpcap.lib.VC6下的加入方法是Project->Settings->Link的Objects/library modules里面加入wpcap.lib。
接下来是使用winpcap开发包中的一些函数的问题。
1。用pcap_lookupnet时发现网卡的IP和掩码都是0.0.0.0并且无法捕捉。出现这个问题很多是因为使用了pcap_lookupdev这个函数。最好不要使用pcap_lookupdev这个函数,这个函数也是winpcap开发手册中不推荐使用的,因为在实际使用中我们会发现很多机器在查找网卡时都能找到一个虚拟的网卡,而且这个很多时候都在第一个位置,这样向下一步提交设备句柄的时候就已经传错了。推荐您使用pcap_findalldevs返回一个网卡列表,然后找到您需要的正常网卡。这样也适合向多网卡移植。
2。在使用了pcap_findalldevs,并且调试时发现已经是正常网卡,可是还是无法捕获。出现这个问题请您在调试时看看是否网卡的前面还有如:rpcap://这样的字段,这可能是因为您没有注意pcap_findalldevs,pcap_findalldevs_ex,pcap_open,pcap_open_live这几个函数的区别的原因,请您参考winpcap开发手册,里面有这样的字段The following formats are not allowed as 'source' strings:
rpcap:// [to open the first local adapter]
rpcap://hostname/ [to open the first remote adapter]
在上面的2种找网卡,和打开方式中,有的打开是没有rpcap://这种字段的,有的却有,有没有这个字段,后面的操作是不一样的,有的需要使用pcap_createsrcstr()来创建正确的字段,所以您一定要注意了。
3。以上都没有问题,可是还是抓不到包,好像winpcap没有工作。请您察pcap_open或pcap_open_live函数中的延迟参数设置,一般设到1000(ms),因为如果您是在主线程下捕获,延迟设置过小(一般200ms以下就不稳定了)会使winpcap无法工作,多线程下没有这个问题,设到1都可以正常工作。
4。在MFC下开发的问题,不要使用在Dos下开发时常用的pcap_loop而要选用pcap_next_ex等替代函数,这样才不会有回掉函数的那个问题。可以参看winpcap开发手册其中有如下说明:
The callback-based capture mechanism of pcap_loop() is elegant and it could be a good choice in some situations. However, handling a callback is sometimes not practical -- it often makes the program more complex especially in situations with multithreaded applications or C++ classes.
阅读(6324) | 评论(2) | 转发(0) |