开发者

Get current QNetworkInterface active and connected to the internet

I would like get the current network interface active and connected to the internet.

Actually, I can check if a network is up and if is not a loop back 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.h开发者_运维百科ardwareAddress();
        }

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"

In fact it works but I found also VM interfaces. And I want to only select WLAN interfaces and Ethernet interfaces.


Sorry to revive an old question, but I was just pondering this myself 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 (e.g. 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 may want to make it a little more robust, so the code could keep track of both the interface and the ip address, but that may be unnecessary, since I'm pretty sure an interface can't hold more than one ip address, and no two interfaces can have the same IP address (correct me if I'm wrong on that assumption).


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 have just added the

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

to your second if statement. Now it doesn't list adapters containing the string "vm".

Hope this helps for other people too.


Use the 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's 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 4.7 documentation.


Set up a TCP connection using QTcpSocket. Next, get its .localAddress. You might find that different parts of the Internet correspond to different local adresses.


for windows
// return -- interface ipv4 entry, interface type
QList<QPair<QHostAddress,QNetworkInterface::InterfaceType>> getActiveNetworks()
{
    QProcess m_process;
    QStringList param;param<<"Get-NetAdapter -physical | where status -eq 'up' |Format-List -Property \"MacAddress\"";
    m_process.start("powershell",param);
    m_process.waitForFinished();
    QString result =  m_process.readAllStandardOutput();
    QStringList resultList = result.split("\r\n\r\n");
    resultList.removeAll("");
    QStringList macAddressList;
    for(auto maclist :resultList)
    {
        QString temp = maclist.split(':').at(1);
        temp.remove(' ');
        temp.replace('-',':');
        macAddressList.append(temp);
    }
    QList<QPair<QHostAddress,QNetworkInterface::InterfaceType>> networks;
    for(auto interface:QNetworkInterface::allInterfaces())
    {
        if(macAddressList.contains(interface.hardwareAddress()))
            for(QNetworkAddressEntry address:interface.addressEntries())
               if(address.ip().toIPv4Address())
                networks.append(QPair<QHostAddress,QNetworkInterface::InterfaceType>
                            (address.ip(),interface.type()));
    }
    return networks;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜