首页 > 其他分享 >Qt搜索本机网卡对应网段的在线设备

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

时间:2023-12-18 10:37:47浏览次数:27  
标签:网段 Qt temp ip cmd list 网卡 sousuo res

需求:销售给我的需求是找出哪些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); }
    }

}

 

标签:网段,Qt,temp,ip,cmd,list,网卡,sousuo,res
From: https://www.cnblogs.com/shiyixirui/p/17910456.html

相关文章

  • Qt 信号槽相关
    Qt中信号与槽的机制用于实现对象之间的通信,这种机制允许对象在特定事件发生时发送信号,而其他对象可以通过连接到这些信号的槽函数来响应这些事件。Qt官方的相关文档在此:https://doc.qt.io/qt-5/signalsandslots.html实现信号槽的功能首先需要两个(可以是同一个)对象,一个负责发送......
  • 我的qt 控件样式设计
        /*中央窗口央视*/QWidget#CentralWidget{background:rgb(237,255,243);}/*测试题管理窗口*/QWidget#ManageTestQuestions{/*background:rgb(0,0,0,80);*/border-image:url(:/resource/modified5.png);}/*测试题编辑窗口*/QWidget#EditTe......
  • qt滚动条样式设计
    /*整个垂直滚动条区域样式*/QScrollBar:vertical{border:none;background:rgb(30,30,30);width:10px;margin:0px00px0;}/*整个水平滚动条区域样式*/QScrollBar:horizontal{border:none;background:rgb(30,30,30);height:10px;m......
  • C++ Qt开发:自定义Dialog对话框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍自定义Dialog组件的常用方法及灵活运用。在之前的文章中笔者已经为大家展示了默认Dialog组件的使......
  • 一种PVE直通全网卡,不丢管理的小技巧
    参考来源:B站up,非常普通的旅者关键词:PVE小技巧,网卡直通,NAS概要:PVE网络除了常规的物理网络设备外,还存在一个虚拟的网络设备lo没在网络的UI界面显示。我们可以通过桥接lo的方式接入虚拟机主路由的LAN口,形成一个虚拟机的内部网络。再直通所有网卡到虚拟主路由,通过主路由管理所有......
  • Qt 5.9.6+VS2019 community 环境配置
    介绍GCCminGW安装Qt5.9.6安装VS2019community略配置VS2019community在VS的管理拓展里面下载Qtvisualstudiotools如果下得很慢就手动下载vsaddin......
  • C++ Qt开发:标准Dialog对话框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍标准对话框QInputDialog、QFileDialog这两种对话框组件的常用方法及灵活运用。在Qt中,标准对话......
  • Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标
    一、前言通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面放大,也可以将该圈起来的区域位置发给设备,由设备设定对应的热点区域作为集中观察点......
  • qt 折叠与展开 窗口,折叠列表,展开列表,抽屉效果,根据窗口大小自动产生滚动条
      自定义折叠控件,h头文件#ifndefQUESTIONBANKWIDGET_H#defineQUESTIONBANKWIDGET_H#include<QWidget>#include<QVBoxLayout>#include<QHBoxLayout>#include<QToolButton>#include<QPushButton>#include<QLabel>#include<......
  • QT 入门之 搭建环境 2023年 踩坑记
    QT5.13.1-安装MSVC2017-Windows_msvc2017单独安装-CSDN博客不懂的可以参考以上文章 安装vs2017/2015toolkit是为了编译器(有些公司项目用vs2015写的)安装win10sdk是为了调试器 记得安装完win10sdk后切换到QT选项中的编译器autodetected 后重启一下q......