需求:销售给我的需求是找出哪些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搜索本机网卡对应网段的在线设备的更多相关文章

  1. Linux下多网卡同网段多IP网络分流设定方法

    Linux下多网卡同网段多IP网络分流设定方法 -- :: 标签:Linux下多网卡同网段多IP网络分流设定方法 当服务器需要较高的网络流量时,在其它资源不造成瓶颈的情况下无疑会用到多网卡. 第1选项 ...

  2. Linux 双网卡双网段通信

    /********************************************************************************* * Linux 双网卡双网段通信 ...

  3. OpenStack 虚机网卡的创建过程

    原文链接:https://www.cnblogs.com/potato-chip/p/9127083.html OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机. ...

  4. OpenStack虚机网卡的创建过程

    OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机.虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡.虚机的创建和管理是Nova的任 ...

  5. Qt获取本机IP地址

    Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...

  6. 关闭防火墙和设置主机名和ip及克隆机网卡处理方法

    关闭防火墙: service NetworkManager stop --图形化用ifconfig之前先关掉网络服务. chkconfig NetworkManager off (将开机自启动关掉,使 ...

  7. 经验分享:Linux 双网卡 不同网段 网络互通

    环境如下: 现状:一台linux主机上有两个网卡eth0 和eth1 ,机器能访问192网的服务资源,但不能访问10网段的资源. 要求:linux能通过eth1访问10网段的资源 路由: 网卡: 操作 ...

  8. QT编写上位机程序一定要初始化变量以及谨慎操作指针

    背景: 在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象. 正文: 上位机有个函数为check_receive():该函数的作用为定时调用循环检测USB是否有数据.若有,则将信 ...

  9. Eureka客户端网卡和网段选择

    当机器上有多个网卡或者机器上配置了回环地址的时候,Eureka客户端呈报给服务端的IP将不可预见,为了指定IP我们需要增加以下配置: 在bootstrap.yml中增加配置内容: spring: cl ...

  10. Linux 双网卡 不同网段 网络互通

    环境如下: 现状:一台linux主机上有两个网卡eth0 和eth1 ,机器能访问192网的服务资源,但不能访问10网段的资源. 要求:linux能通过eth1访问10网段的资源 路由: 网卡: 操作 ...

随机推荐

  1. 前后端分离项目(七):实现"添加"功能(前端视图)

    好家伙,本篇用于测试"添加"接口,为后续"用户注册"功能做铺垫   (完整代码在最后) 我们要实现"添加"功能 老样子我们先来理清一下思路, ...

  2. DataGear 自定义数据可视化图表

    DataGear内置了很多常用的图表(折线图.柱状图.饼图.散点图.雷达图.地图等等),能满足大部分数据可视化需求,当内置图表无法满足时,则可以通过自定义图表或插件的方式,实现特定业务的数据可视化需求 ...

  3. 【Azure 应用服务】VS2019发布应用到正在运行的App Service时失败问题的解决

    问题描述 在VS 2019中配置号App Service的Publish Profile后,发布应用出现错误.根据VS 2019中的输出消息可知有文件正在运行中,无法被替换,所以发布失败. 问题解决 ...

  4. 【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?

    问题描述 在App Service Authentication 中配置 Azure AD 注册的应用信息后,根据官方文档,可以让前端应用实现用户 AAD 登录,然后通过前端应用获取的Token,来访 ...

  5. 在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧

    Playwright 是一个由 Microsoft 开发的开源工具,用于自动化 Web 浏览器的测试和操作.它提供了一种跨浏览器.跨平台的自动化解决方案,可以在 Chromium.Firefox 和 ...

  6. 5、Azure Devops之Azure Test Plans篇

    1.什么是Azure Test Plans Azure Test Plans是提供给团队测试人员,管理测试计划.测试套件.测试用例的部件.管理测试计划.测试用例的定义,包括请求类型定义.参数定义,执行 ...

  7. 【Mahjong hdu 枚举】搜索枚举

    #####枚举 import java.io.*; import java.util.*; public class Main { static HashSet<String> set1; ...

  8. 【STM32F4 HAL】MPU6050食用

    关于MPU6050模块的食用>_<(本人比较菜,写的不好或有错误的地方欢迎大佬指出) 最近学校冬令营发了个MPU6050模块,第一次弄也花了我花了不少时间,于是就把其中一些步骤以及要点简单 ...

  9. 浅谈React与SolidJS对于JSX的应用

    React将JSX这一概念深入人心.但,并非只有React利用了JSX,VUE.SolidJS等JS库或者框架都使用了JSX这一概念.网上已经有大量关于JSX的概念与形式的讲述文章,不在本文的讨论范围 ...

  10. 【Leetcode】63. 不同路径 II

    题目(链接) 一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 ...