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

时间:2017-07-20 15:21:54

标签: c++ pcap winpcap

我正在编写一个程序,该程序使用winpcap来捕获由我们的交换机发出的特定网络流量。

但是,无线设备永远不会收到这些数据包,所以我试图弄清楚如何确定网络适配器是无线还是有线(这样我就可以完全跳过无线适配器上的捕获)。

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

接下来的想法是尝试 pcap_can_set_rfmon(),这应该告诉我设备是否不能设置为监控模式(因此,如果它是或不是有线)。但是,当我尝试使用它时,我似乎得到2019链接错误,这似乎与没有Airpcap的Windows不支持的功能有关吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我有一种解决方案,仅适用于Windows系统。

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

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

我也检查Windows版本;因为仅从Vista(Winver 6+)开始,适配器返回的 IF_TYPE_IEEE80211 是无线的。

它没有使用 WinPCap ,但是我再也不确定它是否可能。由于我已在其他地方使用这些Windows库,因此我认为这是我所做的特定于平台的折衷方案。希望有一天能帮助别人!