如何使用QT获取计算机的本地IP地址

时间:2012-10-17 04:45:34

标签: c++ qt ip ipconfig

我想在QT中获取计算机的本地IP地址(IPV4)。 我找到了以下代码:

QNetworkInterface *inter = new QNetworkInterface();
QList<QHostAddress> list;
list=inter->allAddresses();
QString str;

for (int i = 0; i < list.size(); ++i) {
     str = list.at(i).toString();
}

通过for循环我可以看到list中有许多值(ip),其中一个是我在命令窗口中键入ipconfig得到的实际本地IP地址

我的问题是如何区分ip地址与list中的所有ip?

2 个答案:

答案 0 :(得分:10)

PC通常有多个IP地址。实际上并没有“本地”IP地址这样的东西;连接到某个远程主机时使用的IP地址至少取决于本地路由表(可能随时发生巨大变化,例如启动/停止VPN软件时)。

在我看来,将IP视为仅在远程网络环境中有效更有意义,例如: “这是我在互联网上连接到这台主机时使用的本地IP地址;但这是我用来通过公司的VPN连接到这台主机的本地IP地址。”

如果您想查找将用于通用Internet连接的本地IP地址,我所知道的最准确的方法就是对代表主机(以及具有高可靠性的主机)进行连接测试!

QTcpSocket socket;
socket.connectToHost("8.8.8.8", 53); // google DNS, or something else reliable
if (socket.waitForConnected()) {
    qDebug()
        << "local IPv4 address for Internet connectivity is"
        << socket.localAddress();
} else {
    qWarning()
        << "could not determine local IPv4 address:"
        << socket.errorString();
}

注意:上面的示例是阻止,如果你的应用有UI,你可能想要重写它以使用信号和插槽。

答案 1 :(得分:2)

我认为,应该尝试多次尝试来增加GUESS的机会(无论软件多么聪明,它仍然是一个猜测,它不会覆盖1%的配置,可能是你的情况: - )

我结合并扩展了两种解决方案。首先,我检查谷歌DNS,然后检查具有标准网关的本地IP。假设是:Getaway具有相同的掩码,addreess以“.1”结尾。我无法找到,如何获得标准。 Qt的网关(更可靠)。

以下代码适用于 ON MY COMPUTERS

    QTcpSocket dnsTestSocket;   
    QString localIP="127.0.0.1";    //fall back
    QString googleDns = "8.8.8.83";  //try google DNS or sth. else reliable first
    dnsTestSocket.connectToHost(googleDns, 53);
    if (dnsTestSocket.waitForConnected(3000)) 
    {
        localIP = dnsTestSocket.localAddress().toString();
    } 
    else 
    {
        foreach (const QHostAddress &address, QNetworkInterface::allAddresses())
        {
            QString guessedGatewayAddress = address.toString().section( ".",0,2 ) + ".1";

            if (address.protocol() == QAbstractSocket::IPv4Protocol 
                && address != QHostAddress(QHostAddress::LocalHost)
                )
            {
                dnsTestSocket.connectToHost(guessedGatewayAddress, 53);
                if (dnsTestSocket.waitForConnected(3000))
                {
                    localIP = dnsTestSocket.localAddress().toString();
                    break;
                }
            }   
        }
    }