我想在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?
答案 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;
}
}
}
}