如何使用QT获取计算机的本地IP地址
How to get local IP address of a computer using QT
我正在尝试获取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();
}
通过循环我可以看到list
中有许多值(IP),其中之一是我通过在命令窗口中键入ipconfig
获得的实际本地IP地址。
我的问题是如何将IP地址与list
中的所有IP区分开?
PC通常具有多个IP地址。实际上没有"本地IP地址"这样的事情;连接到某些远程主机时将使用的IP地址至少取决于本地路由表(例如,在启动/停止VPN软件时可能会发生巨大变化)。
在我看来,只有在远程网络的上下文中,将IP视为有效,例如"如果我要在Internet上连接到此主机,这是我使用的本地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%的配置您可能会遇到什么: - )
我已经合并并扩展了这两个解决方案。首先,我会检查Google DNS,然后检查具有标准网关的本地IP。假设是:"逍遥游"具有与" .1"结尾的addreess相同的掩码。我找不到,如何获得性病。QT中的网关(这更可靠)。
这是我的计算机上有效的代码:
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;
}
}
}
}
相关文章:
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 使用 C++将 IP 地址附加到字符*
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- Rabbitmq 将本地主机更改为 IP 地址C++
- C++ - 使用代码块从文件中读取 IP 地址
- C 使用from_string创建IP地址的C 导致lambda错误
- 如何在解析过程中区分 IP 地址和域名
- 如何使用 asio 库获取 IP 地址的主机名
- IP地址匹配过滤功能
- 如何将C++ ulong 4 字节 IP 地址正确转换为 C# 类型
- 如何在NS3中设置节点的IP地址和数据?
- 如何从活动的 udp 连接获取远程 IP 地址和端口
- 无符号的 int 到 IP 地址字符串,不带 itoa/to_string/boost
- 如何在FD_SET内获取套接字的IP地址
- 使用Boost库中的PC中获取我的以太网设备IP地址的列表
- 使用静态IP地址时,ESP32 httpclient连接拒绝了
- C++检查有效的 IP 地址或 IP
- 如何使用 Poco::Net::HTTPSClientSession 绑定特定的源 IP 地址
- 如何在Windows上绕过主机文件获取真实的IP地址