Qt搜索本机网卡对应网段的在线设备

需求:销售给我的需求是找出哪些IP是没有被占用的,所以我要先找出已经被占用的IP

 

项目是Qt开发的,所以在网上搜索了下,搜索到的实现方式都是:QHostInfo::lookupHost,但是这种方式,我发现有部分已经占用了的IP还是搜索不出来,遂放弃这种方式。

// QHostInfo::lookupHost 方式搜索占用的IP-片段代码
QHostInfo::lookupHost("10.10.13.11", this, SLOT(lookedUp(QHostInfo)));

void QWidget::lookedUp(const QHostInfo & host)
{
    if (host.error() != QHostInfo::NoError) {
        qDebug() << "Lookup failed:" << host.errorString();
        return;
    }

    // 如果IP地址和主机名不一致,就判断为占用了
    if (host.addresses()[0].toString() != host.hostName())
    {
        qDebug() << "被占用了:" << host.addresses()[0].toString();
    }
}

 

后面发现了其他的方式,比如,使用cmd(arp -a)命令,可以搜索出网段内占用的IP,发现这种方式好很多,不知道是不是百分百正确,但是觉得靠谱很多

正确的demo:

// 因为我的电脑安装有虚拟机,所有有多个网卡,为了其他函数调用方便,可以指定网卡,所以这里会搜索出所有的网卡
void wifiTestQtDemo::btn_sousuo_wangka()
{
    ui.comboBox_wangka->clear();
    face_list.clear();
    /*QList<QNetworkInterface> */face_list = QNetworkInterface::allInterfaces();
    for (int i = 0; i < face_list.count(); i++)
    {        
        ui.comboBox_wangka->addItem(face_list.at(i).humanReadableName());
    }
}

 

void wifiTestQtDemo::btn_sousuo_cmd()
{
    auto address_list = face_list.at(ui.comboBox_wangka->currentIndex()).addressEntries();
    for (int i = 0; i < address_list.count(); i++)
    {
        auto t_ip = address_list.at(i).ip();
        if (t_ip.protocol() == QAbstractSocket::IPv4Protocol)
        {
            ui.edit_sousuo->setText(t_ip.toString());
            break;
        }
    }

    // 获取本机网卡IP
    QString IP = ui.edit_sousuo->text();
    QStringList ip_list = IP.split(".");

    // 执行cmd命令
    QProcess process;
    process.start("arp -a");
    process.waitForStarted();
    process.waitForFinished();
    QString cmd_res_text = QString::fromLocal8Bit(process.readAllStandardOutput());

    QStringList sousuo_ip_list;
    QStringList cmd_res_list = cmd_res_text.split("\r\n");  // 拆分成数组
    for (int i = 0; i < cmd_res_list.size(); i++)
    {
        if (cmd_res_list.at(i).isEmpty()) { cmd_res_list.removeAt(i); }             // 过滤空字符串
        if (cmd_res_list.at(i).contains("---")) { cmd_res_list.removeAt(i); }       // 过滤标头
        if (cmd_res_list.at(i).contains("Internet")) { cmd_res_list.removeAt(i); }  // 过滤无效数据
    }

    // 解析出单个有效IP
    for (int i = 0; i < cmd_res_list.size(); i++)
    {
        QStringList temp_ip_list = cmd_res_list.at(i).split("  ");
        for (int j = 0; j < temp_ip_list.size(); j++)
        {
            if (!temp_ip_list.at(j).isEmpty()) { sousuo_ip_list.push_back(temp_ip_list.at(j)); break; }
        }
    }

    // 解析出正确的IP
    cmd_res_list.clear();
    cmd_res_list = sousuo_ip_list;
    sousuo_ip_list.clear();
    for (int i = 0; i < cmd_res_list.size(); i++)
    {
        QStringList temp_ip_list = cmd_res_list.at(i).split(".");
        if (temp_ip_list.at(0) == ip_list.at(0) && temp_ip_list.at(1) == ip_list.at(1) && temp_ip_list.at(2) == ip_list.at(2))
        {
            sousuo_ip_list.push_back(cmd_res_list.at(i));
        }
    }



    // 调试打印
    for each (auto s in sousuo_ip_list)
    {
        qDebug() << QString::fromLocal8Bit("被占用的IP: ") << s;
    }

    // 解析数据,添加到下拉框
    for (int i = 0; i < 256; i++)
    {
        ip_list.pop_back();
        ip_list.push_back(QString::number(i));
        QString temp_localhost_ip = ip_list.join(".");
        if (sousuo_ip_list.contains(temp_localhost_ip)) { ui.comboBox_zaixian->addItem(temp_localhost_ip); }
        else { ui.comboBox_keyong->addItem(temp_localhost_ip); }
    }

}

 

posted @ 2023-12-18 10:23  十一的杂文录  阅读(32)  评论(0编辑  收藏  举报