Qt 中是否有任何 API 或标志来检查 Windows/Linux/MAC OS 上可用的物理网络 interface/ports?
Is there any API or Flags in Qt to check available physical network interface/ports on Windows/Linux/MAC OS?
我正在尝试为 Windows/Linux/MAC OS 获取笔记本电脑上所有可用物理端口的 MAC 地址。我还想检查一下我是否可以检测到网线的物理 connection/disconnection。
我尝试使用 QNetworkInterface API,但它为我提供了所有物理和逻辑接口。我不知道如何区分物理端口。我们有这样做的标志吗?
我试过一些代码
foreach(QNetworkInterface netInterface, QNetworkInterface::allInterfaces())
{
if (!(netInterface.flags() & QNetworkInterface::Ethernet))
{
return netInterface.hardwareAddress();
}
}
以下是我的 MAC
的网络接口、名称、类型和硬件地址的结果
(IsUp|IsRunning|CanBroadcast|CanMulticast) "en0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "p2p0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "awdl0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "en1" QNetworkInterface::Ethernet "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "en2" QNetworkInterface::Ethernet "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "bridge0" QNetworkInterface::Unknown "XX: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 无法获得更深入的 OS 细节。我们需要触摸 OS 层来实现相同的效果。
- 为Windows-
MIB_IF_ROW2 ifRow;
ifRow.InterfaceAndOperStatusFlags.ConnectorPresent
检查此标志以达到相同目的。
- 对于MACOS
static_cast<SCNetworkInterfaceRef>(CFArrayGetValueAtIndex(physicalVLANInterfaces, i)) for all CFIndex
- 对于Linux
File *fp = popen("lshw -class network | grep -A 1 \"bus info\" | grep name | awk -F': ' '{print }'", "r");
不确定是否有比这更好的解决方案。但这最适合我。
我正在尝试为 Windows/Linux/MAC OS 获取笔记本电脑上所有可用物理端口的 MAC 地址。我还想检查一下我是否可以检测到网线的物理 connection/disconnection。
我尝试使用 QNetworkInterface API,但它为我提供了所有物理和逻辑接口。我不知道如何区分物理端口。我们有这样做的标志吗?
我试过一些代码
foreach(QNetworkInterface netInterface, QNetworkInterface::allInterfaces())
{
if (!(netInterface.flags() & QNetworkInterface::Ethernet))
{
return netInterface.hardwareAddress();
}
}
以下是我的 MAC
的网络接口、名称、类型和硬件地址的结果(IsUp|IsRunning|CanBroadcast|CanMulticast) "en0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "p2p0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "awdl0" QNetworkInterface::Wifi "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "en1" QNetworkInterface::Ethernet "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "en2" QNetworkInterface::Ethernet "XX:XX:XX:XX:XX:XX"
(IsUp|IsRunning|CanBroadcast|CanMulticast) "bridge0" QNetworkInterface::Unknown "XX: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 无法获得更深入的 OS 细节。我们需要触摸 OS 层来实现相同的效果。
- 为Windows-
MIB_IF_ROW2 ifRow;
ifRow.InterfaceAndOperStatusFlags.ConnectorPresent
检查此标志以达到相同目的。
- 对于MACOS
static_cast<SCNetworkInterfaceRef>(CFArrayGetValueAtIndex(physicalVLANInterfaces, i)) for all CFIndex
- 对于Linux
File *fp = popen("lshw -class network | grep -A 1 \"bus info\" | grep name | awk -F': ' '{print }'", "r");
不确定是否有比这更好的解决方案。但这最适合我。