在Qt中获取本地IP地址

sas*_*alm 28 c++ ip qt symbian

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

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

ben*_*bin 42

使用QNetworkInterface :: allAddresses()

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

  • +1:不幸的是,它还返回虚拟机,虚拟盒等的地址.我通过检查最后一个数字是否为1(通常是逃离的IP)&& address.toString()来使用快​​速而脏的修复. section(".", - 1,-1)!="1".如果发现当地的Ip也有标准的假期,我仍然在寻找ckeck的可能性. (8认同)

小智 16

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

  }
Run Code Online (Sandbox Code Playgroud)


小智 6

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


小智 6

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)