【问题标题】:QNetworkInterface returns duplicate addressesQNetworkInterface 返回重复的地址
【发布时间】:2020-10-09 02:03:46
【问题描述】:

用于 RPi3 的 Qt5.9.2。 这里是当前的目标场景:

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.167  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fd00::b465:a62:a349:a7a5  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::dbfe:16c3:a5cd:9509  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:22:00:43  txqueuelen 1000  (Ethernet)
        RX packets 338  bytes 44737 (43.6 KiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 238  bytes 27565 (26.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 40  bytes 8560 (8.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 8560 (8.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.179  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fd00::2eed:5f16:9646:fe07  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::c460:6252:ee34:8695  prefixlen 64  scopeid 0x20<link>
        ether 00:c6:b1:8f:a1:38  txqueuelen 1000  (Ethernet)
        RX packets 149  bytes 45709 (44.6 KiB)
        RX errors 0  dropped 97  overruns 0  frame 0
        TX packets 106  bytes 17632 (17.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

这是我应该检索 IPv4 地址的代码:

const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
for (const QNetworkInterface &interface: QNetworkInterface::allInterfaces())
{
    QString name = interface.name();
    for (const QHostAddress &address: interface.allAddresses())
    {
        if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost && (interface.flags() & QNetworkInterface::IsRunning))
            qDebug() << name << address << interface.flags();
    }
}

这里是输出:

"lo" QHostAddress("192.168.1.167") QFlags(0x1|0x2|0x8)
"lo" QHostAddress("192.168.1.179") QFlags(0x1|0x2|0x8)
"eth0" QHostAddress("192.168.1.167") QFlags(0x1|0x2|0x4|0x20)
"eth0" QHostAddress("192.168.1.179") QFlags(0x1|0x2|0x4|0x20)
"wlan0" QHostAddress("192.168.1.167") QFlags(0x1|0x2|0x4|0x20)
"wlan0" QHostAddress("192.168.1.179") QFlags(0x1|0x2|0x4|0x20)

相反,根据ifconfig,我只期待:

"eth0" QHostAddress("192.168.1.167") QFlags(0x1|0x2|0x4|0x20)
"wlan0" QHostAddress("192.168.1.179") QFlags(0x1|0x2|0x4|0x20)

我的代码错了吗?

【问题讨论】:

  • QNetworkInterface::allAddresses 此便捷函数返回在主机上找到的所有 IP 地址。

标签: qt network-programming qt5 qtnetwork


【解决方案1】:

原因

正如QNetworkInterface::allInterfaces 的文档所说:

此便捷函数返回在主机上找到的所有 IP 地址

注意:重点是我的。

这意味着,如果有两个接口,您的代码将基本上循环两次地址。

解决方案

请改用QNetworkInterface::addressEntries。然后使用QNetworkAddressEntry::ip获取您需要的信息。

示例

以下是建议解决方案的示例实现:

for (auto interface : QNetworkInterface::allInterfaces()) {
    for (auto address : interface.addressEntries()) {
        const QHostAddress &ip(address.ip());

        if (!ip.isLoopback() && (ip.protocol() == QAbstractSocket::IPv4Protocol) && (interface.flags() & QNetworkInterface::IsRunning))
            qDebug() << interface.humanReadableName() << ip.toString();
    }
}

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 2010-12-18
    • 2021-04-28
    • 1970-01-01
    • 2019-05-30
    • 2011-08-09
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多