如何通过WinPCap确定网络适配器是有线还是无线?

问题描述:

我正在编写一个程序,它使用winpcap捕获我们的交换机发出的一些特定的网络流量。但是,无线设备将永远不会收到这些数据包,因此我试图找出如何确定网络适配器是无线还是有线(这样我就可以完全跳过无线适配器上的捕获)。如何通过WinPCap确定网络适配器是有线还是无线?

我的第一个想法是检查所选接口的介质(当前基于该适配器的IP地址进行选择 - 逻辑是,如果它具有IP地址,则连接)。问题是,是否pcap_datalink()将返回DLT_EN10MB,无论其有线或无线。

下一个念头,就是尝试pcap_can_set_rfmon(),这应该告诉我,如果该设备不能设置为监控模式(因此如果还是没有连线)。然而,当我尝试使用这个函数时,我似乎得到了2019年的链接错误,这似乎被认为是在没有Airpcap的情况下不支持Windows的函数?

我真的不知道还有什么可以尝试,但如果有人有任何指针,这将是非常棒的。我想知道如果我不得不开始使用NDIS来确定系统上的每个适配器,然后将其匹配到WinPCap所使用的设备名称,那么它会变得多么困难和复杂。当然,这是我可以保留的东西内部使用lib/WinPCap?

谢谢!

我有一个解决方案,只适用于Windows系统。

对于我想要根据所连接的网络选择的适配器,我可以将与该适配器关联的IP地址与由GetAdaptersInfo生成的对象中的每个IP地址进行比较。如果它们匹配,那么我可以看到同一个对象上的“类型”是否是以太网。

if ((pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) && (WINVER > _WIN32_WINNT_WS03)) 
{ 
} 

我也检查Windows版本;因为它只是从Vista(Winver 6+)起,IF_TYPE_IEEE80211在适配器中返回是无线的。

它没有使用WinPCap,但后来我不知道它有可能。由于我已经在其他地方使用这些Windows库,我认为这是我将要做的一个特定于平台的折衷。希望有一天能帮助别人!