Get the current QNetworkInterface active and connected to the Internet

I would like to activate the current network interface and connect to the Internet.

In fact, I can check if the network is working and if it is not a feedback network.

foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces()) { if (interface.flags().testFlag(QNetworkInterface::IsUp) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) foreach (QNetworkAddressEntry entry, interface.addressEntries()) { if ( interface.hardwareAddress() != "00:00:00:00:00:00" && entry.ip().toString().contains(".")) items << interface.name() + " "+ entry.ip().toString() +" " + interface.hardwareAddress(); } 

Results:

 "en1 3.3.3.52 D4:9A:20:61:1F:72" "vmnet1 192.168.169.1 00:50:56:C0:00:01" "vmnet8 192.168.210.1 00:50:56:C0:00:08" 

Actually this works, but I also found the vm interfaces. And I will not choose only wlan interfaces and Ethernet interfaces

+4
source share
4 answers

Sorry to revive the old question, but I just thought it over and came up with a solution:

 QList<QString> possibleMatches; QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces(); if ( !ifaces.isEmpty() ) { for(int i=0; i < ifaces.size(); i++) { unsigned int flags = ifaces[i].flags(); bool isLoopback = (bool)(flags & QNetworkInterface::IsLoopBack); bool isP2P = (bool)(flags & QNetworkInterface::IsPointToPoint); bool isRunning = (bool)(flags & QNetworkInterface::IsRunning); // If this interface isn't running, we don't care about it if ( !isRunning ) continue; // We only want valid interfaces that aren't loopback/virtual and not point to point if ( !ifaces[i].isValid() || isLoopback || isP2P ) continue; QList<QHostAddress> addresses = ifaces[i].allAddresses(); for(int a=0; a < addresses.size(); a++) { // Ignore local host if ( addresses[a] == QHostAddress::LocalHost ) continue; // Ignore non-ipv4 addresses if ( !addresses[a].toIPv4Address() ) continue; QString ip = addresses[a].toString(); if ( ip.isEmpty() ) continue; bool foundMatch = false; for (int j=0; j < possibleMatches.size(); j++) if ( ip == possibleMatches[j] ) { foundMatch = true; break; } if ( !foundMatch ) { possibleMatches.push_back( ip ); qDebug() << "possible address: " << ifaces[i].humanReadableName() << "->" << ip; } } } } // Now you can peek through the entries in possibleMatches // With VMWare installed, I get two entries, and the first one is the correct one. // If you wanted to test which one has internet connectivity, try creating a tcp // connection to a known internet service (eg google.com) and if the connection // is successful, check the following on the tcp connection /* if ( socket->localAddress().toIPv4Address() ) { for(int c=0; c < possibleMatches.size(); c++) if ( socket->localAddress().toString() == possibleMatches[c] ) { qDebug() << "Your LAN IP:" << possibleMatches[c]; } } */ 

You might want to make it more reliable, so the code can track both the interface and the IP address, but this may be unnecessary, as I am sure that the interface cannot contain more than one ip address, and neither of the two interfaces may have the same IP address (correct me if I am mistaken in this assumption).

+5
source

I know the question is old, but I'm working on something similar.

Here is my solution:

  foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces()) { if (interface.flags().testFlag(QNetworkInterface::IsUp) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) foreach (QNetworkAddressEntry entry, interface.addressEntries()) { if ( interface.hardwareAddress() != "00:00:00:00:00:00" && entry.ip().toString().contains(".") && !interface.humanReadableName().contains("VM")) items << interface.name() + " "+ entry.ip().toString() +" " + interface.hardwareAddress(); } 

I just added

&& !interface.humanReadableName().contains("VM")

to your second if statement. Now it does not list adapters containing the string "vm".

Hope this helps other people as well.

+2
source

Use enum QNetworkInterface::InterfaceFlag to get this information.

 QNetworkInterface::IsUp 0x1 the network interface is active QNetworkInterface::IsRunning 0x2 the network interface has resources allocated QNetworkInterface::CanBroadcast 0x4 the network interface works in broadcast mode QNetworkInterface::IsLoopBack 0x8 the network interface is a loopback interface: that is, it a virtual interface whose destination is the host computer itself QNetworkInterface::IsPointToPoint 0x10 the network interface is a point-to-point interface: that is, there is one, single other address that can be directly reached by it. QNetworkInterface::CanMulticast 0x20 the network interface supports multicasting 

From Qt Documentation 4.7 .

+1
source

Configure a TCP connection using QTcpSocket . Then enter .localAddress . You may find that different parts of the Internet correspond to different local addresses.

-1
source

Source: https://habr.com/ru/post/1346973/


All Articles