qt用多线程实现局域网端口扫描代码项目
时间: 2023-11-16 09:12:30 浏览: 147
QT实现端口扫描
4星 · 用户满意度95%
以下是一个基于 Qt 多线程的局域网端口扫描代码项目,供参考:
mainwindow.h:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QStandardItemModel>
namespace Ui {
class MainWindow;
}
class ScanThread : public QThread
{
Q_OBJECT
public:
explicit ScanThread(QObject *parent = nullptr);
void run() override;
void setRange(int start, int end);
signals:
void progress(int value);
void found(int port);
private:
int m_start;
int m_end;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_scanButton_clicked();
void on_clearButton_clicked();
void on_found(int port);
private:
Ui::MainWindow *ui;
QStandardItemModel *m_model;
ScanThread *m_thread;
};
#endif // MAINWINDOW_H
```
mainwindow.cpp:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTcpSocket>
#include <QStandardItemModel>
ScanThread::ScanThread(QObject *parent) : QThread(parent)
{
}
void ScanThread::setRange(int start, int end)
{
m_start = start;
m_end = end;
}
void ScanThread::run()
{
for (int port = m_start; port <= m_end; port++)
{
QTcpSocket socket;
socket.connectToHost("localhost", port);
if (socket.waitForConnected(100))
{
emit found(port);
}
emit progress(port - m_start + 1);
}
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_model = new QStandardItemModel(this);
m_model->setHorizontalHeaderLabels({"Port Number"});
ui->tableView->setModel(m_model);
m_thread = new ScanThread(this);
connect(m_thread, &ScanThread::progress, ui->progressBar, &QProgressBar::setValue);
connect(m_thread, &ScanThread::found, this, &MainWindow::on_found);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_scanButton_clicked()
{
int start = ui->startSpinBox->value();
int end = ui->endSpinBox->value();
m_thread->setRange(start, end);
m_model->removeRows(0, m_model->rowCount());
ui->statusBar->showMessage("Scanning...");
m_thread->start();
}
void MainWindow::on_clearButton_clicked()
{
m_model->removeRows(0, m_model->rowCount());
}
void MainWindow::on_found(int port)
{
m_model->appendRow({new QStandardItem(QString::number(port))});
}
```
在这个例子中,我们通过继承自 QThread 的 ScanThread 类来实现多线程。ScanThread 的 run() 函数中,我们将扫描从 start 到 end 端口,与 localhost 建立连接。如果连接成功,则触发 found(int port) 信号,表示找到了开放的端口。同时,我们也会触发 progress(int value) 信号,表示当前扫描的进度。在 MainWindow 中,我们将 ScanThread 的 progress(int value) 信号连接到一个 QProgressBar 上,以显示扫描进度。将 ScanThread 的 found(int port) 信号连接到 on_found(int port) 槽上,以将找到的端口添加到一个 QStandardItemModel 中,再将这个 model 显示在一个 QTableView 中。
这个例子只是一个简单的局域网端口扫描程序,可能需要根据实际需求进行修改和完善。
阅读全文