qt获取本机ip,本地ip,qhostaddress qnetworkinterface

本文介绍了一种使用 Qt 库中的 QNetworkInterface 类来获取计算机的外网 IP 地址的方法。通常情况下,第一个地址为本地回环地址 127.0.0.1,而实际的外网 IP 地址紧随其后。

【转载请注明出处:blog.youkuaiyun.com/lanmanck】

搜索了一下网上,说的都不是很对,这个就没问题了:

 

QString str;

  QList<QHostAddress> NetList = QNetworkInterface::allAddresses(); //取得全部信息

  for(int Neti = 0;Neti < NetList.count(); Neti++)
  {
   str = NetList.at(Neti).toString();
   //qDebug()<<str;
   if(str != "127.0.0.1")
    break;
  }

一般第一个是127.0.0.1,第二个是外网地址.

<think>我们参考上述引用中的方法,总结出两种常用的Qt获取本地IP地址的方法: 方法1:使用QNetworkInterface::allAddresses()遍历所有网络接口的地址,筛选IPv4地址。 方法2:通过QHostInfo获取本地主机名,再根据主机名获取地址列表,然后筛选IPv4地址。 我们将分别实现这两种方法,并给出示例代码。 注意:在获取IP地址时,我们通常需要过滤掉回环地址(127.0.0.1)和无效地址,并且只获取IPv4地址(或根据需要获取IPv6)。 方法1(直接使用QNetworkInterface): 步骤: 1. 获取所有网络接口的地址列表:QList<QHostAddress> list = QNetworkInterface::allAddresses(); 2. 遍历这个列表,对每个地址进行判断: - 协议类型为IPv4(QAbstractSocket::IPv4Protocol) - 不是回环地址(QHostAddress::LocalHost)和Null地址 方法2(使用QHostInfo): 步骤: 1. 获取本地主机名:QString hostName = QHostInfo::localHostName(); 2. 根据主机名获取主机信息:QHostInfo hostInfo = QHostInfo::fromName(hostName); 3. 获取主机信息中的地址列表:QList<QHostAddress> addList = hostInfo.addresses(); 4. 遍历地址列表,同样筛选IPv4地址且不是回环地址。 注意:方法2中,主机名解析可能不会立即返回,但QHostInfo::fromName()在传入本地主机名时通常是立即完成的。不过,如果网络配置复杂,可能会有多个地址,需要选择正确的。 我们更推荐方法1,因为它直接获取所有接口的地址,更直接且不易出错。 下面分别给出两种方法的代码示例: 方法1示例代码: ```cpp #include <QHostAddress> #include <QNetworkInterface> QString getLocalIPByNetworkInterface() { // 获取所有网络接口的地址列表 QList<QHostAddress> list = QNetworkInterface::allAddresses(); foreach (const QHostAddress &address, list) { // 检查协议类型是否为IPv4且不是回环地址 if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) { // 返回第一个符合条件的IPv4地址 return address.toString(); } } // 如果没有找到,返回空字符串或回环地址(这里返回回环地址作为保底) return QHostAddress(QHostAddress::LocalHost).toString(); } ``` 方法2示例代码: ```cpp #include <QHostInfo> #include <QHostAddress> QString getLocalIPByHostInfo() { QString hostName = QHostInfo::localHostName(); QHostInfo hostInfo = QHostInfo::fromName(hostName); if (hostInfo.error() != QHostInfo::NoError) { qDebug() << "Lookup failed:" << hostInfo.errorString(); return QString(); // 返回空字符串 } QList<QHostAddress> addList = hostInfo.addresses(); foreach (const QHostAddress &address, addList) { if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) { return address.toString(); } } return QHostAddress(QHostAddress::LocalHost).toString(); } ``` 注意:在实际应用中,一台机器可能有多个非回环IPv4地址(例如多个网卡),上述代码只返回第一个符合条件的地址。如果需要所有IPv4地址,可以修改为返回一个字符串列表。 另外,上述代码中,我们排除了回环地址(127.0.0.1),但有时我们可能希望包括它(如果没有其他地址)。这里我们做了排除,如果没有找到非回环地址,则返回回环地址(在方法1的末尾)。在方法2中,如果没有找到,我们返回了回环地址。可以根据实际需求调整。 根据引用[1]和引用[4]中的方法,我们更倾向于使用QNetworkInterface的方法,因为它更直接,且能获取到所有接口的地址。 因此,推荐使用方法1。 下面我们给出一个更健壮的方法,获取所有非回环IPv4地址(可能多个): ```cpp QStringList getAllLocalIPv4Addresses() { QStringList ips; QList<QHostAddress> list = QNetworkInterface::allAddresses(); foreach (const QHostAddress &address, list) { if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) { ips.append(address.toString()); } } return ips; } ``` 这样,用户可以根据需要选择第一个或者全部。 最后,请注意,这些方法都需要在Qt网络模块被初始化的前提下使用(通常我们在.pro文件中添加`QT += network`,并且在代码中不需要特别初始化,因为Qt网络模块在第一次使用时自动初始化)。 希望以上内容能够帮助您解决问题。 相关问题: 1. Qt中如何获取本机IPv6地址? 2. 如何获取特定网络接口(如eth0)的IP地址? 3. Qt中如何判断一个IP地址是公网IP还是私有IP?</think>在Qt框架中获取本地主机的IP地址,主要有两种常用方法。以下分别说明实现步骤和示例代码: ### 方法一:使用QNetworkInterface(推荐) 直接遍历所有网络接口获取IPv4地址: ```cpp #include <QNetworkInterface> #include <QHostAddress> QString getLocalIP() { QString localIP; // 获取所有网络接口的地址列表 QList<QHostAddress> addresses = QNetworkInterface::allAddresses(); for (const QHostAddress &address : addresses) { // 筛选IPv4地址且排除回环地址 if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress::LocalHost) { localIP = address.toString(); break; // 获取第一个符合条件的IP } } return localIP; // 示例输出: "192.168.1.100" } ``` ### 方法二:通过主机名解析 先获取主机名再解析IP地址: ```cpp #include <QHostInfo> QString getLocalIP() { QString hostName = QHostInfo::localHostName(); // 获取主机名 QHostInfo hostInfo = QHostInfo::fromName(hostName); // 解析主机名 if (hostInfo.error() != QHostInfo::NoError) { qDebug() << "Lookup failed:" << hostInfo.errorString(); return ""; } // 遍历解析结果 for (const QHostAddress &address : hostInfo.addresses()) { if (address.protocol() == QAbstractSocket::IPv4Protocol) { return address.toString(); // 返回第一个IPv4地址 } } return ""; } ``` ### 关键注意事项 1. **IPv4/IPv6选择** 通过`QAbstractSocket::IPv4Protocol`或`QAbstractSocket::IPv6Protocol`筛选协议类型 2. **多网卡处理** 一台主机可能有多个IP(如以太网、WiFi),上述代码返回第一个符合条件的IP。若需获取全部IP: ```cpp QStringList allIPs; for (const QHostAddress &addr : QNetworkInterface::allAddresses()) { if (addr.protocol() == QAbstractSocket::IPv4Protocol) { allIPs.append(addr.toString()); } } ``` 3. **排除特殊地址** `QHostAddress::LocalHost`(127.0.0.1)为回环地址,通常需要排除 4. **项目配置** 在`.pro`文件中添加网络模块依赖: ```qmake QT += network ``` ### 典型输出示例 ``` 192.168.1.100 // 有线网络 10.0.0.2 // 无线网络 172.17.0.1 // Docker虚拟接口 ``` --- ### 相关问题 1. **如何区分公网IP和私有IP?** Qt本身不提供此功能,需自行实现IP范围检查(如私有IP范围:`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`)[^4]。 2. **为什么有时获取到多个IP地址?** 当主机有多个网络接口(如以太网+WiFi+虚拟网卡)时,每个接口可能有独立IP[^1]。 3. **如何获取特定网络接口的IP?** 可通过`QNetworkInterface::interfaceFromName("eth0")`指定接口名,再获取IP列表[^4]。 4. **IPv6地址如何获取?** 将协议筛选条件改为: ```cpp address.protocol() == QAbstractSocket::IPv6Protocol ``` [^1]: QT获取本地IP的方法 [^2]: Qt中通过主机名解析IP [^3]: 遍历QHostInfo获取IP [^4]: QNetworkInterface多网卡处理
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值