C++ Qt实现IP端口扫描(实现获取本机网卡IP信息,并扫描局域网内IP端口是否开启)

C++ Qt实现IP端口扫描(实现获取本机网卡IP信息,并扫描局域网内IP端口是否开启)提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档

大家好,欢迎来到IT知识分享网。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、获取本机所有网卡IP
    • 1.QNetworkInterface类
    • 2.QNetworkAddressEntry类
    • 3.实现代码
  • 二、扫描局域网内ip端口是否开启
    • 1.实现代码
  • 三、源码

一、获取本机所有网卡IP

1. QNetworkInterface类 

        QNetworkInterface 类提供了一组简单易用的接口,方便我们获取本机的网络接口信息。同时也为我们的网络编程提供了更多的可能性。

        QNetworkInterface::allInterfaces()用于获取系统中所有网络接口的列表。

        它可以用来获取网络接口的各种详情:

        name(): 返回网络接口的名称,通常是设备名,如 “eth0” 或 “wlan0″。
        humanReadableName(): 返回一个对用户友好的名称,这通常是对网络接口的一种描述,如 “Local Area Connection”。
        hardwareAddress(): 返回网络接口的硬件地址(即 MAC 地址),例如 “00:1A:2B:3C:4D:5E”。
        flags(): 返回一个 QNetworkInterface::InterfaceFlags 枚举值的组合,表示网络接口的状态和功能。常用的标志包括:
                QNetworkInterface::IsUp: 接口已启用。
                QNetworkInterface::IsRunning: 接口正在运行。
                QNetworkInterface::CanBroadcast: 接口支持广播。
                QNetworkInterface::IsLoopBack: 接口是回环接口。
                QNetworkInterface::IsPointToPoint: 接口是点对点连接。
        addressEntries(): 返回一个 QList<QNetworkAddressEntry> 列表,QNetworkAddressEntry 包含了与网络接口关联的一个 IP 地址及其子网掩码。
                ip(): 返回 IP 地址。
                netmask(): 返回子网掩码。
                broadcast(): 返回广播地址(如果适用)











2.QNetworkAddressEntry类

        QNetworkAddressEntry 是 Qt 框架中的一个类,用于表示网络接口上的一个 IP 地址条目。它包含了一个 IP 地址及其相关的子网掩码和广播地址。这个类通常与 QNetworkInterface 一起使用,以便获取和操作网络接口上的 IP 地址信息。

        以下是 QNetworkAddressEntry 类常用的一些主要成员函数和属性:

                ip():
                        返回类型: QHostAddress
                        说明: 返回该条目的 IP 地址。
               netmask():
                        返回类型: QHostAddress
                        说明: 返回该条目的子网掩码。




               prefixLength():
                        返回类型: int
                        说明: 返回该条目的前缀长度(CIDR 表示法中的位数)。对于 IPv4,范围是 0 到 32;对于 IPv6,范围是 0 到 128。
                broadcast():
                        返回类型: QHostAddress
                        说明: 返回该条目的广播地址。对于没有广播地址的网络接口(如点对点连接),这可能返回一个无效的地址。




3.实现代码

std::vector<std::string> newipscan() { vector<string> v; QList<QNetworkInterface> list=QNetworkInterface::allInterfaces(); for(int i = 0;i<list.count();i++) { QNetworkInterface aInterface=list.at(i); QList<QNetworkAddressEntry> entryList=aInterface.addressEntries(); for(int j = 0;j<entryList.count();j++) { QNetworkAddressEntry aEntry=entryList.at(j); QString s = aEntry.ip().toString(); string ss = s.toStdString(); int flag = 0; for(int p = 0;p<ss.size();p++) { if(ss[p]<'0' || ss[p] > '9') { if(ss[p] != '.') { flag = 1; break; } } } if(flag == 1 || ss == "127.0.0.1" || ss.empty())// 过滤本地回环127.0.0.1 { continue; } for(int k = ss.size()-1;k>=0;k--) { if(ss[k] == '.') { break; } ss.pop_back(); } v.push_back(ss); } } return v; } 

二、扫描局域网内ip端口是否开启

1.实现代码

             连接后可以读取数据。

void ipscan() { vector<string> v = newipscan(); std::string s2; QString qsip; for(int i = 0;i<v.size();i++) { QString sz = QString::fromStdString(v[i]); qDebug().noquote()<<"正在扫描ip段:"<<sz<<"..."; for(int j = 1;j<255;j++) { qsip = QString::fromStdString(v[i]); QString sint = QString::number(j); qsip.append(sint); QTcpSocket socket; socket.connectToHost(qsip, 8060); if (!socket.waitForConnected(10)) { } else { QString sstr = "http://"; sstr.append(qsip); sstr.append(":8060");//端口可以自定义 int flag = 0; QNetworkAccessManager manager; QNetworkRequest request; request.setUrl(QUrl(sstr)); //std::cout<<sms1.txt<<std::endl; //qDebug()<<str; QNetworkReply *reply = manager.get(request); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QString strMessage = "";//错误信息 QString strResult = "";//http响应 QByteArray array; QString res; string snum; if (reply->isFinished()) { if (reply->error() == QNetworkReply::NoError)//正常结束,读取响应数据 { strResult = reply->readAll(); //读取数据 //qDebug() << strResult; res.append(strResult); std::string ssr = res.toStdString(); } else//异常结束,比如不存在的http服务器,错误信息:Connection refused { qDebug()<<"拒绝连接"; std::cout<<"Connection refused"<<std::endl; } } else//超时,错误信息:Operation canceled { QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); reply->abort(); qDebug() << "[" << __FILE__ << "]" << __LINE__ << __FUNCTION__ << " timeout"; } QNetworkReply::NetworkError e = reply->error(); if (e) { strMessage = reply->errorString(); } reply->deleteLater(); socket.disconnectFromHost(); // 连接成功后断开连接 qDebug().noquote() <<"ip:" << qsip<<"端口:8060已启动 "; } } } qDebug()<<"扫描完成"; }

三、源码

#include <QCoreApplication> #include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkReply> #include<QtNetwork/QNetworkInterface> #include<QString> #include<iostream> #include<stdlib.h> #include<stdio.h> #include<string> #include<unistd.h> #include<algorithm> #include<QDebug> #include<QtNetwork/QTcpSocket> #include<vector> #include<QTextCodec> #include<QList> #include<windows.h> #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif using namespace std; QString m_ip; int isGateway_ID = 0; void enableAnsiEscapeCodes() { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); if (hCon == INVALID_HANDLE_VALUE) return; DWORD dwMode = 0; if (!GetConsoleMode(hCon, &dwMode)) return; dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; if (!SetConsoleMode(hCon, dwMode)) { std::cerr << "Failed to enable ANSI escape codes." << std::endl; } } std::vector<std::string> newipscan() { vector<string> v; QList<QNetworkInterface> list=QNetworkInterface::allInterfaces(); for(int i = 0;i<list.count();i++) { QNetworkInterface aInterface=list.at(i); QList<QNetworkAddressEntry> entryList=aInterface.addressEntries(); for(int j = 0;j<entryList.count();j++) { QNetworkAddressEntry aEntry=entryList.at(j); QString s = aEntry.ip().toString(); string ss = s.toStdString(); int flag = 0; for(int p = 0;p<ss.size();p++) { if(ss[p]<'0' || ss[p] > '9') { if(ss[p] != '.') { flag = 1; break; } } } if(flag == 1 || ss == "127.0.0.1" || ss.empty())// 过滤本地回环127.0.0.1 { continue; } for(int k = ss.size()-1;k>=0;k--) { if(ss[k] == '.') { break; } ss.pop_back(); } v.push_back(ss); } } return v; } void ipscan() { vector<string> v = newipscan(); std::string s2; QString qsip; for(int i = 0;i<v.size();i++) { QString sz = QString::fromStdString(v[i]); qDebug().noquote()<<"正在扫描ip段:"<<sz<<"..."; for(int j = 1;j<255;j++) { qsip = QString::fromStdString(v[i]); QString sint = QString::number(j); qsip.append(sint); QTcpSocket socket; socket.connectToHost(qsip, 8060); if (!socket.waitForConnected(10)) { } else { QString sstr = "http://"; sstr.append(qsip); sstr.append(":8060"); int flag = 0; QNetworkAccessManager manager; QNetworkRequest request; request.setUrl(QUrl(sstr)); //std::cout<<sms1.txt<<std::endl; //qDebug()<<str; QNetworkReply *reply = manager.get(request); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QString strMessage = "";//错误信息 QString strResult = "";//http响应 QByteArray array; QString res; string snum; if (reply->isFinished()) { if (reply->error() == QNetworkReply::NoError)//正常结束,读取响应数据 { strResult = reply->readAll(); //读取数据 //qDebug() << strResult; res.append(strResult); std::string ssr = res.toStdString(); } else//异常结束,比如不存在的http服务器,错误信息:Connection refused { qDebug()<<"拒绝连接"; std::cout<<"Connection refused"<<std::endl; } } else//超时,错误信息:Operation canceled { QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); reply->abort(); qDebug() << "[" << __FILE__ << "]" << __LINE__ << __FUNCTION__ << " timeout"; } QNetworkReply::NetworkError e = reply->error(); if (e) { strMessage = reply->errorString(); } reply->deleteLater(); socket.disconnectFromHost(); // 连接成功后断开连接 qDebug().noquote() <<"ip:" << qsip<<"端口:8060已启动 "; } } } qDebug()<<"扫描完成"; } QString byteArrayToUnicode(const QByteArray array) { QTextCodec::ConverterState state; QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state); if (state.invalidChars > 0) { text = QTextCodec::codecForName("GBK")->toUnicode(array); } return text; } int main(int argc, char *argv[]) { enableAnsiEscapeCodes(); qDebug()<<"\033[32m"<<" -------- IPscan ---------\n"<<"\033[0m"; QCoreApplication a(argc, argv); ipscan(); cout<<endl; system("pause"); return 0; } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134893.html

(0)
上一篇 2025-07-08 19:26
下一篇 2025-07-08 19:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信