在Qt中获取本地IP地址

41

是否有一种 Qt 跨平台的方法可以获取本地 IP 地址(即类似于 192.168.1.49 的地址)?

我想为 Symbian 手机制作一个 FTP 服务器,并显示 FTP 客户端应连接到的 IP 地址。

6个回答

61

使用 QNetworkInterface::allAddresses()

const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
for (const QHostAddress &address: QNetworkInterface::allAddresses()) {
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost)
         qDebug() << address.toString();
}

10
不幸的是,它也返回虚拟机、虚拟盒等地址。我使用了一个简单粗暴的方法,通过检查最后一个数字是否不是1(通常是网关的IP)&& address.toString().section(".", -1, -1) != "1" 来解决这个问题。我仍在寻找可能性来检查发现的本地IP地址是否具有标准网关。 - Valentin H

18

QNetworkInterface::allAddresses()将给出网络地址。您可以过滤结果以获取不是回环地址的IPv4地址:

QList<QHostAddress> list = QNetworkInterface::allAddresses();

 for(int nIter=0; nIter<list.count(); nIter++)

  {
      if(!list[nIter].isLoopback())
          if (list[nIter].protocol() == QAbstractSocket::IPv4Protocol )
        qDebug() << list[nIter].toString();

  }

7

如果您需要的信息不仅仅是IP地址(比如子网),您需要遍历所有接口。

QList<QNetworkInterface> allInterfaces = QNetworkInterface::allInterfaces();
QNetworkInterface eth;

foreach(eth, allInterfaces) {
    QList<QNetworkAddressEntry> allEntries = eth.addressEntries();
    QNetworkAddressEntry entry;
    foreach (entry, allEntries) {
        qDebug() << entry.ip().toString() << "/" << entry.netmask().toString();
    }
}

7

QNetworkInterface会返回很多地址,你必须对它们进行过滤,以获得想要的结果:

foreach (const QNetworkInterface &netInterface, QNetworkInterface::allInterfaces()) {
    QNetworkInterface::InterfaceFlags flags = netInterface.flags();
    if( (bool)(flags & QNetworkInterface::IsRunning) && !(bool)(flags & QNetworkInterface::IsLoopBack)){
        foreach (const QNetworkAddressEntry &address, netInterface.addressEntries()) {
            if(address.ip().protocol() == QAbstractSocket::IPv4Protocol)
                qDebug() << address.ip().toString();
        }
    }
}

6

以下是我编写的代码,用于获取本地主机的名称、IP地址、子网掩码和MAC地址。

   QString localhostname =  QHostInfo::localHostName();
   QString localhostIP;
   QList<QHostAddress> hostList = QHostInfo::fromName(localhostname).addresses();
   foreach (const QHostAddress& address, hostList) {
       if (address.protocol() == QAbstractSocket::IPv4Protocol && address.isLoopback() == false) {
            localhostIP = address.toString();
       }
   }
   QString localMacAddress;
   QString localNetmask;
   foreach (const QNetworkInterface& networkInterface, QNetworkInterface::allInterfaces()) {
       foreach (const QNetworkAddressEntry& entry, networkInterface.addressEntries()) {
           if (entry.ip().toString() == localhostIP) {
               localMacAddress = networkInterface.hardwareAddress();
               localNetmask = entry.netmask().toString();
               break;
           }
       }
   }
   qDebug() << "Localhost name: " << localhostname;
   qDebug() << "IP = " << localhostIP;
   qDebug() << "MAC = " << localMacAddress;
   qDebug() << "Netmask = " << localNetmask;

2

我想获取目标机器的eth1 IP地址。上面提供的答案帮助我达到了我的目的:这就是我编写的函数,用于获取网络接口名称eth1的IP地址。

QNetworkInterface eth1Ip = QNetworkInterface::interfaceFromName("eth1");
QList<QNetworkAddressEntry> entries = eth1Ip.addressEntries();
if (!entries.isEmpty()) {
    QNetworkAddressEntry entry = entries.first();
    qDebug() << entry.ip();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接