首先展示一下效果:

 

 

Qt实现端口扫描器

 

界面通过Qt设计师做出来的。

主要有两个类。

首先主函数:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

实现UI循环。

第一个类,主窗体类:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QDebug>
#include <QTcpSocket>
#include "scanner.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    bool checkip(QString ip);
    void startscanner(QString ip,int startport,int endport);

    ~MainWindow();

private slots:
    void on_pushButton_clicked();//开始扫描
    void setBar(int value);//修改进度条

    void on_pushButton_2_clicked();//暂停

    void on_pushButton_3_clicked();//终止

private:
    Ui::MainWindow *ui;
    Scanner *scanner;
    bool threadisrunnig;

};

#endif // MAINWINDOW_H

因为是用的Qt设计师,所以函数名有点挫。

然后是扫描线程类,用来扫描端口:

#ifndef SCANNER_H
#define SCANNER_H
#include<QThread>
class Scanner:public QThread
{
    Q_OBJECT

public:
    Scanner();
    void run();//不多说,自己Google
    void stop();//实现线程安全停止,用Terminate是不安全的
signals:
    sentnowport(int value);//更新进度条
private:
     volatile bool stopped;

};
#endif // SCANNER_H

 

类实现:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMutex>
#include<QThread>
#include<QProgressBar>
#include <QGraphicsItem>

QMutex percent;
QMutex mutex;
QMutex text;
int nowport;
int staport;
int endport;

QString ip;
QTextEdit *result;

Scanner::Scanner()
{
    stopped=false;
}

void Scanner::run()
{
    while(!stopped)
    {
        if(nowport>endport)
        {
            break;
        }

        mutex.lock();
        int tmpport=nowport++;
        mutex.unlock();

       emit sentnowport(nowport);
       QTcpSocket socket(0);
       socket.abort();
       socket.connectToHost(ip,tmpport);
       if(socket.waitForConnected(1000))
        {

           //qDebug()<<"connect";
           text.lock();
           QString message="";
           message+=QString::number(tmpport,10)+"  opened!";
           result->append(message);
           text.unlock();
           //qDebug()<<"connect over";
       }

       else
           ;//qDebug()<<tmpport<<"not open"<<endl;

    }
    stopped=false;
}
void Scanner::stop()
{
    stopped=true;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton_2->setVisible(false);
    threadisrunnig=false;

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setBar(int value)
{
    //qDebug()<<value;
    ui->progressBar->setValue(value);
}

bool MainWindow::checkip(QString ip)
{
    QRegExp rx2("\\d+\\.\\d+\\.\\d+\\.\\d+");
     if( !rx2.exactMatch(ip) )
     {
           return false;
     }
     //qDebug()<<"check true";
     return true;
}
void MainWindow::on_pushButton_clicked()
{
    QString desip=ui->lineEdit->text();
    ui->progressBar->setValue(0);
    ui->pushButton_2->setText("暂停");

    //qDebug()<<desip;
    if(!checkip(desip))
    {
        ui->lineEdit->setText("ip 地址错误");
    }
    else
    {
        //ui->progressBar->setRange(0,0);
         ip=desip;
         staport=ui->spinBox->value();
         endport=ui->spinBox_2->value();
         nowport=staport;
         result=ui->textEdit;
         result->clear();
         //qDebug()<<staport<<endport<<nowport;
         int num=ui->spinBox_3->value();

         scanner=new Scanner[num];
         ui->progressBar->setRange(staport,endport);

        ui->pushButton_2->setVisible(true);
         for(int i=0;i<num;i++)
         {
             scanner[i].start();
             threadisrunnig=true;
             connect(scanner+i,SIGNAL(sentnowport(int)),this,SLOT(setBar(int)));
         }
    }
}

void MainWindow::startscanner(QString ip, int startport, int endport)
{
    if(startport>endport)
    {
        int tmp=startport;
        startport=endport;
        endport=tmp;
    }

     QTcpSocket socket(0);
    for(int i=startport;i<=endport;i++)
    {
        socket.abort();
        socket.connectToHost(ip,i);
        if(socket.waitForConnected(1000))
             qDebug()<<i<<"connected!";

    }
}


void MainWindow::on_pushButton_2_clicked()
{
    if(ui->pushButton_2->text()=="暂停")
    {
        bool couldPause=false;
        for(int i=0;i<ui->spinBox_3->value();i++)
            if(threadisrunnig&&scanner[i].isRunning()) couldPause=true;
        if(!couldPause) return;
        ui->pushButton_2->setText("继续");
        mutex.lock();
    }
    else
    {
        ui->pushButton_2->setText("暂停");
        mutex.unlock();
    }
}

void MainWindow::on_pushButton_3_clicked()
{
    ui->progressBar->setValue(endport);
    ui->pushButton_2->setVisible(false);
    if(!threadisrunnig) return;
    for(int i=0;i<ui->spinBox_3->value();i++)
        scanner[i].stop();
    delete(scanner);
}
View Code

相关文章:

  • 2021-05-27
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-19
  • 2021-06-29
  • 2022-12-23
  • 2021-12-23
  • 2021-11-17
  • 2021-11-04
  • 2018-01-30
相关资源
相似解决方案