环境
- win7 64位 , cmake + qt5.9.4
获取本机IP代码
问题代码
- 其实也不能说是问题, 只是在在某些条件下获取的本机IP不全
- 这里只贴出关键函数的代码
QStringList QToolkits::local_ip(const IP_VERSION&& ipv) noexcept
{
QStringList list_ret_value;
const QList<QHostAddress>&& ipaddress_list = QNetworkInterface::allAddresses();
for (const auto& item : ipaddress_list)
{
QString&& ip_item = item.toString();
int split_pos = ip_item.indexOf('%');
if (-1 != split_pos)
{
if (1 < split_pos)
{
split_pos = split_pos - 1;
}
ip_item = ip_item.left(split_pos);
}
if (IPV4 == ipv)
{
if (true == ip_item.contains(":"))
{
continue;
}
}
else if (IPV6 == ipv)
{
if (true == ip_item.contains(":"))
{
;
}
else
{
continue;
}
}
list_ret_value << ip_item;
}
return list_ret_value;
}
现象
- 现在有两种使用场景, 使用环境中 win7 存在虚拟网卡, 没有接通网线, 但是设置本机Ip
- Qt5.9.4 + cmake
- Qt5.9.4 + Vs2015
- 用上面的这段问题代码, 当cmake+Qt5.9.4中使用时,无法获取虚拟网卡的IP
- 用上面的这段问题代码, 当vs2015+Qt5.9.4中使用时,却可以获取虚拟网卡的IP
QNetworkInterface::allAddresses()
- 官方文档
- allAddresses 函数 会获取本机所有 网卡处于活跃状态的IP。 为什么? 文档中时这样说的:that are in the QNetworkInterface::IsUp state
- 那么QNetworkInterface::IsUp的定义是:
疑惑
- 今天查了好久官方文档,依然没有具体结果。
解决方案
- 手动遍历本机所有网卡上的每一个IP。
- 详见 Qt5获取本机所有IP和串口 文中的local_ip2函数