qt用多线程实现局域网端口扫描代码项目
时间: 2023-11-16 09:12:30 浏览: 189
以下是一个基于 Qt 多线程的局域网端口扫描代码项目:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QTcpSocket>
#include <QDebug>
#include <QMutex>
// 定义端口扫描范围
const int START_PORT = 1;
const int END_PORT = 65535;
// 定义互斥锁,确保线程安全
QMutex mutex;
class PortScanner : public QThread
{
Q_OBJECT
public:
PortScanner(QObject *parent = nullptr) : QThread(parent) {}
signals:
void portFound(int port);
protected:
void run() override
{
while (true) {
int port;
// 加锁,获取下一个要扫描的端口
mutex.lock();
if (m_nextPort > END_PORT) {
mutex.unlock();
break;
}
port = m_nextPort++;
mutex.unlock();
// 扫描端口
QTcpSocket socket;
socket.connectToHost(m_ipAddress, port);
if (socket.waitForConnected(100)) {
emit portFound(port);
}
}
}
public:
// 设置要扫描的 IP 地址
void setIpAddress(const QString &ipAddress)
{
m_ipAddress = ipAddress;
}
private:
QString m_ipAddress;
static int m_nextPort;
};
int PortScanner::m_nextPort = START_PORT;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 获取要扫描的 IP 地址
QString ipAddress;
if (argc > 1) {
ipAddress = argv[1];
} else {
qDebug() << "Usage: " << argv[0] << " <ip-address>";
return -1;
}
// 创建多个线程进行端口扫描
QList<PortScanner*> scanners;
for (int i = 0; i < QThread::idealThreadCount(); ++i) {
PortScanner *scanner = new PortScanner(&a);
scanner->setIpAddress(ipAddress);
QObject::connect(scanner, &PortScanner::portFound, [](int port){
qDebug() << "Port " << port << " is open";
});
scanners.append(scanner);
scanner->start();
}
// 等待所有线程完成
for (PortScanner *scanner : scanners) {
scanner->wait();
}
return 0;
}
```
这个项目中,我们创建了一个 `PortScanner` 类,作为多线程的执行体,用于扫描指定 IP 地址的所有端口。我们可以创建多个 `PortScanner` 对象,并将它们加入到一个线程池中,然后让它们并行地执行端口扫描任务。当某个线程发现一个开放的端口时,它会通过信号 `portFound` 发出端口号,然后主线程通过连接该信号的槽函数来输出该端口号。
阅读全文