Obtenir l'adresse IP locale dans Qt

Existe-t-il un moyen multiplateforme d'obtenir l'adresse IP locale (c'est-à-dire quelque chose qui ressemble à 192.168.1.49) de L'ordinateur utilisant Qt?

Je veux créer un serveur FTP pour un téléphone Symbian et je veux montrer l'adresse IP à laquelle le client FTP doit se connecter.

24
demandé sur sashoalm 2012-12-12 12:51:49

6 réponses

Utiliser QNetworkInterface::allAddresses()

foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost))
         qDebug() << address.toString();
}
37
répondu benjarobin 2015-11-16 14:40:40

QNetworkInterface::allAddresses() vous donnera les adresses réseau. Vous pouvez ensuite filtrer les résultats sur des adresses IPv4 qui ne sont pas des adresses de bouclage:

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

  }
13
répondu Prasoon 2016-05-13 07:20:49

Si vous avez besoin de plus d'informations que de simples adresses IP (comme le sous-réseau), vous devez itérer sur toutes les interfaces.

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();
    }
}
5
répondu Dan 2015-06-09 02:28:03

QNetworkInterface renvoie beaucoup d'adresses. vous devez les filtrer, pour obtenir un résultat souhaitable:

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();
        }
    }
}
2
répondu Hamed Nikzad 2017-08-17 07:11:17

Je voulais obtenir l'adresse IP eth1 de ma machine cible. Les réponses fournies ci-dessus m'ont aidé à obtenir ce que je voulais: C'est ainsi que j'ai écrit ma fonction pour me procurer l'adresse IP du nom de l'interface réseau eth1.

QNetworkInterface eth1Ip = QNetworkInterface::interfaceFromName("eth1");
QList<QNetworkAddressEntry> entries = eth1Ip.addressEntries();
if (!entries.isEmpty()) {
    QNetworkAddressEntry entry = entries.first();
    qDebug() << entry.ip();
}
1
répondu user12345 2016-01-26 04:41:08

Voici le code que j'ai implémenté pour obtenir: nom, IP, netmask et adresse mac de localhost.

   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;
0
répondu user2434119 2018-08-14 19:57:58