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网段的资源 路由: 网卡: 操作 ...
随机推荐
- 【Azure 应用服务】部署WAR包到App Service访问出现404错误的解决方式
问题描述 在Linux的App Service上,通过FTP把war文件和HTML静态文件上传到wwwroot目录下,静态文件访问成功,但是java应用中的请求都返回404错误 问题解决 因为FTP上 ...
- 【Azure 云服务】如果云服务证书过期会有什么影响,证书时间应该如何查看
问题描述 如果云服务证书过期会有什么影响,证书时间应该如何查看 问题答案 在云服务中,有两种证书:服务证书 和 管理证书 什么是服务证书? 通过浏览器访问云服务中的服务(Web Role)时候所使用的 ...
- 【Azure 环境】Azure Key Vault 采用自签名证书,是否需要CA provider
关于 Azure Key Vault 证书,密钥保管库证书支持适用于 x509 证书管理,它提供以下行为: 允许证书所有者通过密钥保管库创建过程或通过导入现有证书来创建证书. 包括自签名证书和证书颁发 ...
- 万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程
万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程 目录 万字长文学会对接 AI 模型:Semantic Kernel 和 Kerne ...
- .NET 全能 Cron 表达式解析库(支持 Cron 所有特性)
前言 今天大姚给大家分享一个.NET 全能 Cron 表达式解析类库,支持 Cron 所有特性:TimeCrontab. Cron表达式介绍 Cron表达式是一种用于配置定时任务的时间表达式.它由一系 ...
- P2251 质量检测(分块线段树RMQ单调队列)
P2251 质量检测 正解应该是ST表和单调队列,不过对于这道题来说只有查询没有修改,这里我还是想用线段树和分块来写,不得不说分块是真好,优雅的暴力 线段树版本: #include <bits/ ...
- Android系统瘦身
文件格式: Windows常见的文件系统是FAT16.FAT32,NTFS,在Windows环境提供了分区格式转换工具,可以在DOC环境下 使用 Convert命令(Convert e:/fs:nt ...
- powershell配置自动补全
powershell配置自动补全 一.需求: 看到老师上课用mac命令行有自动补全功能,发现真的爽.但是自己的windows powershell不能使用自动补全功能.有了需求,就想找到能完成目前的任 ...
- InputRegZen.vue 正则Input 限制输入框输入内容
核心内容 已经 perfect,没有用外库,原生完成 用的 iview的Input组件 封装 // InputRegZen.vue <template> <div> <I ...
- vscode 格式化空格,constructor 构造函数的空格 会有问题,找到一个配置文件好使
Ctrl+Shift+P "javascript.format.enable": false, "javascript.format.insertSpaceAfterCo ...