首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QNetworkInterface返回重复地址

QNetworkInterface返回重复地址
EN

Stack Overflow用户
提问于 2020-06-18 21:31:38
回答 1查看 236关注 0票数 1

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

代码语言:javascript
复制
# 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地址的代码:

代码语言:javascript
复制
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();
    }
}

在这里,输出:

代码语言:javascript
复制
"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的说法,我只期望:

代码语言:javascript
复制
"eth0" QHostAddress("192.168.1.167") QFlags(0x1|0x2|0x4|0x20)
"wlan0" QHostAddress("192.168.1.179") QFlags(0x1|0x2|0x4|0x20)

我的代码错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-22 01:37:12

原因

正如QNetworkInterface::所有接口的文档所述:

这个方便函数返回所有在主机上找到的IP地址。

注:重点是我的。

这意味着,使用两个接口,您的代码本质上将遍历地址两次。

解决方案

使用QNetworkInterface::addressEntries代替。然后使用QNetworkAddressEntry::ip获取所需的信息。

示例

下面是建议的解决方案的一个示例实现:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62459729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档