XProxy点滴:Winpcap获取设备列表时的建议

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

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

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

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

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

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

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

你可能感兴趣的:(XProxy点滴:Winpcap获取设备列表时的建议)