Qt中是否有任何API或标志来检查Windows / Linux / MAC OS上可用的物理网络接口/端口?



我正在尝试获取笔记本电脑上所有可用于Windows/Linux/MAC OS的物理端口的MAC地址。我还想检查是否可以检测到网线的物理连接/断开。

我尝试使用QNetworkInterface API,但它为我提供了所有物理和逻辑接口。我无法了解如何区分物理端口。我们有什么标志可以这样做吗?

我尝试了一些代码

foreach(QNetworkInterface netInterface, QNetworkInterface::allInterfaces())
{
if (!(netInterface.flags() & QNetworkInterface::Ethernet))
{
return netInterface.hardwareAddress();
}
}

以下是我的MAC的网络接口,名称,类型和硬件地址的结果

(IsUp|奔跑|广播|CanMulticast) "en0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX">
(IsUp|奔跑|广播|CanMulticast) "p2p0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX">
(IsUp|奔跑|广播|CanMulticast) "awdl0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX">
(IsUp|奔跑|广播|CanMulticast) "en1" QNetworkInterface::Ethernet "XX:XX:XX:XX">
(IsUp|奔跑|广播|CanMulticast) "en2" QNetworkInterface::Ethernet "XX:XX:XX:XX">
(IsUp|奔跑|广播|CanMulticast) "bridge0" QNetworkInterface::Unknown ">

XX:XX:XX:XX:XX" PS:"XX:XX:XX:XX:XX:XX"是他们的MAC地址

试试 QNetworkConfigurationManager https://doc.qt.io/qt-5/qnetworkconfigurationmanager.html

如何检查接口类型? QNetworkInterface::InterfaceType

我得到了一个解决方案。在做了大量的分析之后,我得出的结论是,Qt无法获得更深入的操作系统细节。我们需要触摸操作系统层来实现相同的目的。

  1. 对于窗口 -
MIB_IF_ROW2 ifRow; 
ifRow.InterfaceAndOperStatusFlags.ConnectorPresent

检查此标志以实现相同的效果。

  1. 适用于 MAC OS
static_cast<SCNetworkInterfaceRef>(CFArrayGetValueAtIndex(physicalVLANInterfaces, i)) for all CFIndex
  1. 对于 Linux
File *fp = popen("lshw -class network | grep -A 1 "bus info" | grep name | awk -F': ' '{print $2}'", "r");

不确定是否有比这更好的解决方案。但这对我来说最有效。

最新更新