XProxy点滴:Winpcap获取设备列表时的建议_别具一阁_百度空间

增加了一个统计数据收发速度的功能,同时发现一个潜在的问题。其实也不能说是问题,因为它不会导致错误。可是如果不做这个速度统计的功能的话恐怕这一点很难被发现:

如果一个应用中Winpcap获取了一次设备列表,然后选中了以设备,并开始在这个设备上工作,或者只是pcap_open(...)打开了这个设备,那么,这时如果需要再一次获取设备列表的话会有这样一个问题:如果{dy}次打开的设备是\Device\NPF_GenericDialupAdapter,那么第二次获取的设备列表中,这个设备将不存在!而如果{dy}次打开的不是\Device\NPF_GenericDialupAdapter,那么第二次获取的设备列表与{dy}次获取的没有任何不同。

因此,如果一个开发者(例如我)习惯用设备的序号来让用户选择设备的话,那么在他第二次企图打开\Device\NPF_GenericDialupAdapter时,就会发现无法打开。举个例子会更明确一些:例如{dy}次获取列表,结果是正常的,而且\Device\NPF_GenericDialupAdapter这个设备在列表中排在{dy}个,此时用户用输入序号的方法选择了\Device\NPF_GenericDialupAdapter,接下去的程序开始在这个设备上工作。然后程序又开了一个线程,第二次获取设备列表,此时列表中不再有\Device\NPF_GenericDialupAdapter了,排在列表{dy}个的是一个真实的网卡设备。那么直接使用刚才用户输入的序号(一般不应在一个线程中让用户再次选择一次设备)就会选中列表中{dy}个设备,即真实网卡。于是就出现了不一致的现象。

事实上,\Device\NPF_GenericDialupAdapter这个设备在硬件上并不存在,它是一个虚拟的设备,而且这个设备上似乎从来没有发送或接收过任何数据,至少Winpcap没有抓到过。一般情况下,这个设备不应被选中,但是Wireshark(原名Etherreal)显示的设备选择列表中仍然保留着这个虚拟设备的名则,用户可以选择它,而Sniffer中则看不到有这么个设备。

我一直不明白用Winpcap获取的设备列表中为什么会有这么个设备,Winpcap的文档中似乎也没有有关的说明。我觉得可以在显示设备列表的时候把它去掉,但是既然Wireshark保留了它,那么去掉很有可能是不合适的。

本文的重点并不是要讨论是否可以去掉列表中的\Device\NPF_GenericDialupAdapter,而是:在用户通过输入序号的方法选择设备之后,程序{zh0}不要用这个序号去作为打开设备的{wy}标志,比较稳妥的方法是使用名字,即pcap_if_t::name。在显示供选择的设备列表时,把设备名一同显示出来,假设用户选择了2号设备,那么接下去的工作应该是获取显示在屏幕上的2号设备的名字,然后遍历设备列表直至找到名字相符的设备,而不应该是用一个循环体,循环2次之后指针“自动”落在所要找的设备上。

当然,用循环的方法并非错误,但是用名字搜索会更加稳妥。至少,使用名字之后你就会发现一个实例中不能同时有两个pcap_t对象在\Device\NPF_GenericDialupAdapter设备上工作。



郑重声明:资讯 【XProxy点滴:Winpcap获取设备列表时的建议_别具一阁_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——