需求:销售给我的需求是找出哪些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. 使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

    前言 为什么会想要调试源码? 苹果开源了部分源码, 但相似内容太多, 基本找不到代码见的对应关系, 如果能像自己工程一样进行跳转那多好哇~~ 苹果源码开源地址: https://opensource. ...

  2. 【Azure 环境】当在Azure 环境中调用外部接口不通时,如何定位SSL Certificate Problem

    问题描述 如果在Azure VM中,发现同一个API,一台VM可以访问成功,另外一台访问失败.如何来调试并定位问题呢? 问题分析 第一步,查看访问外部API不通时候出现什么错误.如果没有明确的错误消息 ...

  3. BIGO 的数据管理与应用实践

    本文首发于 Nebula Graph Community 公众号 本文整理自 BIGO 在 nMeetp 上的主题分享,主要介绍 BIGO 过去一年在数据管理建设方面的理解和探索.而 BIGO 数据管 ...

  4. PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例

    好久没写博客了,最近从人大金仓离职了,新公司入职了蚂蚁集团,正在全力学习 OcenaBase 数据库的体系结构中. 以后分享的案例知识基本上都是以 OcenaBase 分布式数据库为主了,呦西. 昨天 ...

  5. [Linux] 快速修改hosts访问github

    sudo sed -i '/github/d' /etc/hosts sudo bash -c "curl https://gitlab.com/ineo6/hosts/-/raw/mast ...

  6. 关于vue.js:iview-Bug-5114在iview的Poptip气泡提示内调用DatePicker出现遮挡或同时关闭窗口等冲突问题[转]

    转自:https://lequ7.com/guan-yu-vuejsiviewbug5114-zai-iview-de-poptip-qi-pao-ti-shi-nei-diao-yong-datep ...

  7. C#实现FTP服务端和客户端

    目录 简介 FTP客户端 系统客户端 客户端软件 自定义客户端 FTP服务端 系统服务端 服务端软件 自定义服务端 附件 简介 FTP是FileTransferProtocol(文件传输协议)的英文简 ...

  8. debian在使用Thunderbird时英文改为中文

    sudo apt-get install thunder* 随后重启应用!

  9. 杂谈之WEB前端工程师身价

    了解javascript语言规范么?+1000 知道各浏览器的css差异么?+1000 javascript差异呢?+1000 知道html各标签的含义并很好地运用么?+1000 知道如何跨浏览器解决 ...

  10. C 可变参数函数分析(va_start,va_end,va_list...)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...