2017-07-13 79 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