天天看點

qt5多線程掃描器幫助!!!!!

大家好!我是新手,提一個問題!如何實作控制台的多線程端口掃描器。

我已經完成了單線程掃描器。

看了衆多實作多線程的文章,有

1重寫run的。

2 有繼承QObject的。

但目前還是毫無頭緒,經常出現無法解決問題,希望給與明晰的回答!

謝謝各位大神了

//頭檔案 scan.h
#ifndef SCAN_H
#define SCAN_H
#include <QString>
#include <QList>
#include <QDebug>
#include <QTcpSocket>
void scan( QString ad,int sp,int ep)
{
//連接配接并驗證端口是否打開
QTcpSocket connct;
int temp=sp;
QList<int> list;//儲存掃描結果
for(;temp<=ep;temp++)
{

   connct.connectToHost(ad,temp);

    if(connct.waitForConnected(100))
        {
         list.append(temp);
         qDebug()<<"address--"<<ad<<":"<<temp<<"open!"<<endl;
    }else{
        qDebug()<<"address--"<<ad<<":"<<temp<<"close!"<<endl;

    }
    connct.abort();//斷開連接配接

}
qDebug()<<"address--"<<ad<<":"<<"Finish!"<<endl;
qDebug()<<"open-port:"<<list<<endl;
}
#endif // SCAN_H
           
//主程式 main.cpp
#include <QCoreApplication>
#include <QDebug>
#include <QTcpSocket>
#include <iostream>
#include<QTextStream>
#include <QHostInfo>
#include "scan.h"
int main(int argc,char* argv[ ])
{
    QCoreApplication a(argc,argv);
    //為了QT使用c++标準輸入輸出
    QTextStream cin(stdin, QIODevice::ReadOnly);
    QTextStream cout(stdout, QIODevice::WriteOnly);
    //位址和端口号
    int sport,eport,num;
    QString address,name;
    QHostInfo adsname;
    cout<<"#################################################"<<endl;
    cout<<"#################################################"<<endl;
    cout<<"######PortScanner###Ver 1.0######################"<<endl;
    cout<<"########################Power by JudeMoses#######"<<endl;
    cout<<"#################################################"<<endl;
    cout<<"#################################################"<<endl;
while(1){
    cout<<"#please input a number (1:IP 2:website name)#####"<<endl;
    cin>>num;
    switch (num)
    {
    case 1:
        cout<<"IP?"<<endl;
        cin>>address;
        cout<<"IP--"<<address<<endl;
        cout<<"Start Port?"<<endl;
        cin>>sport;
        cout<<"End Port?"<<endl;
        cin>>eport;
        cout<<"Start-port--"<<sport<<endl;
        cout<<"End---port--"<<eport<<endl;
        scan (address,sport,eport);
        break;

    case 2:

        cout<<"website name?"<<endl;
        cin>>name;

        adsname = QHostInfo::fromName(name);
        address=adsname.addresses().first().toString();
        cout<<"IP--"<<address<<endl;
        cout<<"Start Port?"<<endl;
        cin>>sport;
        cout<<"End Port?"<<endl;
        cin>>eport;
        cout<<"Start-port--"<<sport<<endl;
        cout<<"End---port--"<<eport<<endl;
        scan (address,sport,eport);
        break;

     default:
        cout<<"#######WARNING###################################"<<endl;
        cout<<"#######WARNING###################################"<<endl;
        cout<<"#######WARNING###################################"<<endl;
      break;
    }
}
   a.exec();

}

           

繼續閱讀