【问题标题】:Get local IP address in Qt在 Qt 中获取本地 IP 地址
【发布时间】:2012-11-29 22:25:52
【问题描述】:

有没有一种跨平台的方式来获取使用 Qt 的计算机的本地 IP 地址(即看起来像 192.168.1.49 的东西)?

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

【问题讨论】:

    标签: c++ qt ip symbian


    【解决方案1】:

    使用QNetworkInterface::allAddresses()

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

    【讨论】:

    • +1:不幸的是,它还返回虚拟机、虚拟盒子等的地址。我使用了一个快速而肮脏的修复方法,检查最后一个数字是否不是 1(通常是度假的 IP ) && address.toString().section( ".",-1,-1 ) != "1"。如果发现本地 Ip 也有一个标准的假期,我仍在寻找可能性。
    【解决方案2】:

    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();
    
      }
    

    【讨论】:

      【解决方案3】:

      如果您需要的信息不仅仅是 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();
          }
      }
      

      【讨论】:

        【解决方案4】:

        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();
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          这是我实现获取的代码:本地主机的名称、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;
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2011-10-11
              • 1970-01-01
              • 2011-04-08
              • 2014-03-22
              • 2014-06-26
              • 2013-03-17
              • 2012-05-31
              相关资源
              最近更新 更多