【问题标题】:Check IP active address with Qt使用 Qt 检查 IP 活动地址
【发布时间】:2017-07-13 13:24:44
【问题描述】:

我需要检查我的 LAN 中的所有活动 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?

【问题讨论】:

  • “活跃”是什么意思?我想要确定他们的网络设备是否处于活动状态,您需要发送 ping 或其他形式的网络数据包并分析答案。
  • 如何通过 Qt 发送 ping 或数据包??
  • 也许看看这个问题的答案:stackoverflow.com/questions/22935103/…

标签: qt networking ip


【解决方案1】:

好的,这段代码有效:

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";
        }
    }
}

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

【讨论】:

  • 当然这不是很快,但是您可以使用线程池或其他东西同时发送多个 ping 请求。我不确定 teher 是否限制了你应该并行 ping 多少,但如果你确实喜欢一次 10 个 ping,它仍然快 10 倍:D
【解决方案2】:

所有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);
}

【讨论】:

  • @Programmer_ARM:我猜他想检查局域网中的远程目标,而不是他自己的 IP。
  • 您的任务不支持 Qt。我假设您需要 LAN 接入点的支持才能提供所有 IP 地址。例如,路由器调制解调器可能会告诉您所有已连接的 IP 地址。
  • 我添加了新的更改,也许这会对您有所帮助??谢谢)
  • arp-scan 显示 arp 缓存中的所有 ip,以及未激活的 ip;我想我必须使用 QProcess 和 ping!
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多