2012-12-12 13 views
21

Esiste un modo multipiattaforma per ottenere l'indirizzo IP locale (ad esempio qualcosa che assomiglia a 192.168.1.49) del computer utilizzando Qt?Ottieni l'indirizzo IP locale in Qt

Desidero creare un server FTP per un telefono Symbian e voglio mostrare l'indirizzo IP a cui il client FTP deve connettersi.

risposta

32

Usa QNetworkInterface::allAddresses()

foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) { 
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)) 
     qDebug() << address.toString(); 
} 
+5

+1: sfortunatamente, restituisce anche gli indirizzi di macchine virtuali, scatole virtuali, ecc. Ho usato una soluzione rapida e sporca controllando se l'ultimo numero non è t 1 (solitamente IP di una fuga) && address.toString(). section (".", - 1, -1)! = "1". Sto ancora cercando la possibilità di controllare se l'Ip locale ha anche una fuga standard. –

12

QNetworkInterface::allAddresses() vi darà gli indirizzi di rete. È quindi possibile filtrare i risultati per indirizzi IPv4 che non sono loopback indirizzi:

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

    } 
5

Se avete bisogno di ulteriori informazioni che semplici indirizzi IP (come la sottorete), si deve iterare su tutte le interfacce.

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

Volevo ottenere l'indirizzo IP eth1 del mio computer di destinazione. Le risposte fornite in precedenza mi hanno aiutato a ottenere ciò che volevo: ecco come ho scritto la mia funzione per ottenere l'indirizzo IP del nome dell'interfaccia di rete eth1.

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

QNetworkInterface restituisce molti indirizzi. devi filtrarli, per ottenere risultati desiderabili:

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