2012-12-12 22 views
21

Czy istnieje wieloplatformowy sposób uzyskania lokalnego adresu IP (to jest coś, co wygląda na 192.168.1.49) komputera przy użyciu Qt?Uzyskaj lokalny adres IP w Qt

Chcę utworzyć serwer FTP dla telefonu Symbian i chcę pokazać adres IP, z którym powinien się połączyć klient FTP.

Odpowiedz

32

Zastosowanie QNetworkInterface::allAddresses()

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

+1: niestety zwraca również adresy maszyn wirtualnych, wirtualnych skrzynek itp. Użyłem szybkiej i brudnej poprawki sprawdzając, czy ostatni numer nie jest " t 1 (zwykle IP ucieczki) && address.toString(). section (".", - 1, -1)! = "1". Nadal szukam możliwości sprawdzenia, czy lokalny Ip również ma standardowe wyjście. –

12

QNetworkInterface::allAddresses() daje adresy sieciowe. Następnie można filtrować wyniki do adresów IPv4, które nie są LOOPBACK adresami:

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

Jeśli potrzebujesz więcej informacji niż tylko adresy IP (jak podsieci), trzeba iteracyjne nad wszystkie interfejsy.

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

Chciałem uzyskać adres IP mojej docelowej maszyny eth1. Odpowiedzi udzielone powyżej pomogły mi uzyskać to, czego chciałem: Tak napisałem swoją funkcję, aby uzyskać adres IP nazwy interfejsu sieciowego eth1.

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

QNetworkInterface zwraca wiele adresów. musisz je odfiltrować, aby uzyskać pożądany wynik:

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(); 
     } 
    } 
} 
Powiązane problemy