2017-07-13 74 views
0

我需要检查我局域网中的所有活动IP地址。 我试图用这个代码:用Qt检查IP活动地址

void MainWindow::on_pushButton_clicked() { 
QString baseNetowrk = "192.168.1."; 
for(int i = 0;i < 255;i++) { 
    QString currIp = (baseNetowrk + "%1").arg(i); 
    //qDebug() << "IP: " << currIp; 
    QHostInfo hostInfo = QHostInfo::fromName(currIp); 
    qDebug() << "NOME: " << hostInfo.hostName(); 
} 

}

但是这显示了所有IP(我认为在ARP缓存)。
我该如何显示活动IP?

+0

你是什么意思的“积极”?我猜想要确定他们的网络设备是否处于活动状态,您需要发送ping或其他形式的网络数据包并分析答案。 – xander

+0

如何通过Qt发送ping或包? – matteo

+0

也许看看这个问题的答案:https://stackoverflow.com/questions/22935103/get-the-ping-from-a-remote-target-with-qt-windows-linux – xander

回答

0

所有IP地址

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

或ARP扫描

QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); 
     for(int i = 0; i < ipAddressesList.size(); ++ i) { 
      if (ipAddressesList.at(i) != QHostAddress::LocalHost && 
       ipAddressesList.at(i).toIPv4Address()) { 
       ipAddress = ipAddressesList.at(i).toString(); 
       if(ipAddress.left(3) == "192") { 
        break; 
       } 
      } 
     } 

ipAddress = ipAddress.left(ipAddress.lastIndexOf(".") + 1); 

     for(int i = 0; i <= 255; ++i) { 
      m_socketsPool.append(new QTcpSocket(this)); 
      QString currentHost = ipAddress + QString::number(i); 
      connect(m_socketsPool.at(i), SIGNAL(readyRead()), this, SLOT(readFortune())); 
      connect(m_socketsPool.at(i), SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); 
      m_socketsPool.at(i)->connectToHost(currentHost, yourHost); 


    } 




void readFortune() 
{ 
    int i = 0; 
    for(; i < m_socketsPool.size(); ++i) { 
     if(sender() == m_socketsPool.at(i)) { 
      QString currentHost = ipAddress + QString::number(i); 
      qDebug()<<currentHost; 
      ipStringList +=(QStringList() << currentHost); 
      break; 
     } 
    } 

    emit onOutStr(ipStringList); 
} 
+0

但这显示我的IP地址,而不是局域网上的地址.... – matteo

+0

LAN(局域网)IP地址 –

+0

@Programmer_ARM:我猜他想检查局域网中的远程目标,而不是他自己的IP。 – xander

0

确定,此代码的工作:

void MainWindow::on_pushButton_clicked() { 
    QString baseNetowrk = "192.168.1."; 
#if defined(WIN32) 
    QString parameter = "-n 1"; 
#else 
    QString parameter = "-c 1"; 
#endif 
    for(int i = 0; i < 256; i++) { 
     QString currIp(baseNetowrk + QString::number(i)); 
     int exitCode = QProcess::execute("ping", QStringList() << parameter << currIp); 
     if (exitCode == 0) { 
      qDebug() << "OK :" << baseNetowrk + i; 
     } else { 
      qDebug() << "KO"; 
     } 
    } 
} 

唯一的问题是,它是一个有点慢.. ..

+0

当然不是很快,但您可以发送多个ping请求,同时使用线程池或其他东西。我不确定teher是否能够平行运行多少次,但如果你一次只能运行10次,它的运行速度几乎快了10倍:D – xander