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