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); }
} }
Qt搜索本机网卡对应网段的在线设备的更多相关文章
- Linux下多网卡同网段多IP网络分流设定方法
Linux下多网卡同网段多IP网络分流设定方法 -- :: 标签:Linux下多网卡同网段多IP网络分流设定方法 当服务器需要较高的网络流量时,在其它资源不造成瓶颈的情况下无疑会用到多网卡. 第1选项 ...
- Linux 双网卡双网段通信
/********************************************************************************* * Linux 双网卡双网段通信 ...
- OpenStack 虚机网卡的创建过程
原文链接:https://www.cnblogs.com/potato-chip/p/9127083.html OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机. ...
- OpenStack虚机网卡的创建过程
OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机.虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡.虚机的创建和管理是Nova的任 ...
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- 关闭防火墙和设置主机名和ip及克隆机网卡处理方法
关闭防火墙: service NetworkManager stop --图形化用ifconfig之前先关掉网络服务. chkconfig NetworkManager off (将开机自启动关掉,使 ...
- 经验分享:Linux 双网卡 不同网段 网络互通
环境如下: 现状:一台linux主机上有两个网卡eth0 和eth1 ,机器能访问192网的服务资源,但不能访问10网段的资源. 要求:linux能通过eth1访问10网段的资源 路由: 网卡: 操作 ...
- QT编写上位机程序一定要初始化变量以及谨慎操作指针
背景: 在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象. 正文: 上位机有个函数为check_receive():该函数的作用为定时调用循环检测USB是否有数据.若有,则将信 ...
- Eureka客户端网卡和网段选择
当机器上有多个网卡或者机器上配置了回环地址的时候,Eureka客户端呈报给服务端的IP将不可预见,为了指定IP我们需要增加以下配置: 在bootstrap.yml中增加配置内容: spring: cl ...
- Linux 双网卡 不同网段 网络互通
环境如下: 现状:一台linux主机上有两个网卡eth0 和eth1 ,机器能访问192网的服务资源,但不能访问10网段的资源. 要求:linux能通过eth1访问10网段的资源 路由: 网卡: 操作 ...
随机推荐
- 前后端分离项目(七):实现"添加"功能(前端视图)
好家伙,本篇用于测试"添加"接口,为后续"用户注册"功能做铺垫 (完整代码在最后) 我们要实现"添加"功能 老样子我们先来理清一下思路, ...
- DataGear 自定义数据可视化图表
DataGear内置了很多常用的图表(折线图.柱状图.饼图.散点图.雷达图.地图等等),能满足大部分数据可视化需求,当内置图表无法满足时,则可以通过自定义图表或插件的方式,实现特定业务的数据可视化需求 ...
- 【Azure 应用服务】VS2019发布应用到正在运行的App Service时失败问题的解决
问题描述 在VS 2019中配置号App Service的Publish Profile后,发布应用出现错误.根据VS 2019中的输出消息可知有文件正在运行中,无法被替换,所以发布失败. 问题解决 ...
- 【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
问题描述 在App Service Authentication 中配置 Azure AD 注册的应用信息后,根据官方文档,可以让前端应用实现用户 AAD 登录,然后通过前端应用获取的Token,来访 ...
- 在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧
Playwright 是一个由 Microsoft 开发的开源工具,用于自动化 Web 浏览器的测试和操作.它提供了一种跨浏览器.跨平台的自动化解决方案,可以在 Chromium.Firefox 和 ...
- 5、Azure Devops之Azure Test Plans篇
1.什么是Azure Test Plans Azure Test Plans是提供给团队测试人员,管理测试计划.测试套件.测试用例的部件.管理测试计划.测试用例的定义,包括请求类型定义.参数定义,执行 ...
- 【Mahjong hdu 枚举】搜索枚举
#####枚举 import java.io.*; import java.util.*; public class Main { static HashSet<String> set1; ...
- 【STM32F4 HAL】MPU6050食用
关于MPU6050模块的食用>_<(本人比较菜,写的不好或有错误的地方欢迎大佬指出) 最近学校冬令营发了个MPU6050模块,第一次弄也花了我花了不少时间,于是就把其中一些步骤以及要点简单 ...
- 浅谈React与SolidJS对于JSX的应用
React将JSX这一概念深入人心.但,并非只有React利用了JSX,VUE.SolidJS等JS库或者框架都使用了JSX这一概念.网上已经有大量关于JSX的概念与形式的讲述文章,不在本文的讨论范围 ...
- 【Leetcode】63. 不同路径 II
题目(链接) 一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 ...