From c5b48ffdacb7f1822843cb6f87cf193157ed65a3 Mon Sep 17 00:00:00 2001 From: fong Date: Tue, 30 Jan 2024 21:00:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5ping=20ip=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20Signed-off-by:=20fong=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ip_sacaner/scan_run.cpp | 212 +++++++++++++++++++++++++--------------- ip_sacaner/scan_run.h | 19 +++- ip_sacaner/widget.cpp | 103 +++++++++++-------- ip_sacaner/widget.ui | 2 +- 4 files changed, 217 insertions(+), 119 deletions(-) diff --git a/ip_sacaner/scan_run.cpp b/ip_sacaner/scan_run.cpp index 1aab708..ff98dcf 100644 --- a/ip_sacaner/scan_run.cpp +++ b/ip_sacaner/scan_run.cpp @@ -26,6 +26,38 @@ quint32 ipv4str_to_int(const QString& ipstr) } } +trytryping::trytryping() +{ + +} + +void trytryping::run() +{ + emit try_one(1); + qint16 exitCode; + QString ip=this->ipstr; + #ifdef Q_OS_WIN + QString strArg = "ping " + ip + " -n 1 -i 2"; + exitCode = QProcess::execute(strArg); + #else + //其他平台(Linux或Mac) + exitCode = QProcess::execute("ping", QStringList() << "-c 1" << "-t 2" << ip)); + #endif + if(0 == exitCode) + { + //it's alive + qDebug() << "shell ping " + ip + " sucessed!"; + emit connect_ok(this->ipstr); + //发射该IP在线的信号 + + } else { + qDebug() << "shell ping " + ip + " failed!"; + //发射IP离线的信号 + + } + + emit try_one(-1); +} trytry::trytry() @@ -156,90 +188,23 @@ void dispatch::run() } - - - QRegExp ex_port ("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$"); - QRegExp ex_porttoport("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$"); - //QRegExp ex_portmore ("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]);$"); - for (int i = 0; i < str_port_list.size(); ++i) - { - str_ports_temp=str_port_list.at(i).split(";"); - for (int ii = 0; ii < str_ports_temp.size(); ++ii) - { - if(ex_port.exactMatch(str_ports_temp.at(ii))) - { - qDebug()<portb) - { - for(;portb<=porta;portb++) - { - ports_list.append(portb); - ports_num+=1; - - } - }else if(portb>porta) - { - for(;porta<=portb;porta++) - { - ports_list.append(porta); - ports_num+=1; - - } - }else//= - { - ports_list.append(porta); - ports_num+=1; - - } - } - - } - - } - - quint64 scantimes=ips_num*ports_num,now_scan=0; - - qDebug() << "IP: "<now_thread_num<<" - set:"<set_thread_num; + trytry_ping=new trytryping; + trytry_ping->timeout=this->timeout; + trytry_ping->ipstr=str_ips_list.at(ii); - connecttry=new trytry; - connecttry->timeout=this->timeout; - connecttry->ipstr=str_ips_list.at(ii); - connecttry->ipint=ports_list.at(iii); + connect(trytry_ping,&trytryping::try_one,this,&dispatch::f_one); + connect(trytry_ping,&trytryping::connect_ok,[=](QString temp){emit connect_ok(temp);}); + trytry_ping->start(); - connect(connecttry,&trytry::try_one,this,&dispatch::f_one); - connect(connecttry,&trytry::connect_ok,[=](QString temp){emit connect_ok(temp);}); -/* - connect(connecttry,&trytry::finished,[=]{ - connecttry->disconnect(); - connecttry->quit(); - connecttry->wait(); - }); -*/ - connecttry->start(); - - jindu=(quint16)(((qfloat16)(now_scan)/(qfloat16)(scantimes))*100); + jindu=(quint16)(((qfloat16)(ii)/(qfloat16)(ips_num))*100); if(jindu!=jindu_old) { jindu_old=jindu; @@ -248,18 +213,109 @@ void dispatch::run() emit return_jindu(jindu); } - now_scan+=1; while(this->now_thread_num>this->set_thread_num); + } + }else + { + QRegExp ex_port ("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$"); + QRegExp ex_porttoport("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$"); + //QRegExp ex_portmore ("^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]);$"); + for (int i = 0; i < str_port_list.size(); ++i) + { + str_ports_temp=str_port_list.at(i).split(";"); + for (int ii = 0; ii < str_ports_temp.size(); ++ii) + { + if(ex_port.exactMatch(str_ports_temp.at(ii))) + { + qDebug()<portb) + { + for(;portb<=porta;portb++) + { + ports_list.append(portb); + ports_num+=1; + + } + }else if(portb>porta) + { + for(;porta<=portb;porta++) + { + ports_list.append(porta); + ports_num+=1; + + } + }else//= + { + ports_list.append(porta); + ports_num+=1; + + } + } + + } } + quint64 scantimes=ips_num*ports_num,now_scan=0; + qDebug() << "IP: "<now_thread_num<<" - set:"<set_thread_num; + + + connecttry=new trytry; + connecttry->timeout=this->timeout; + connecttry->ipstr=str_ips_list.at(ii); + connecttry->ipint=ports_list.at(iii); + + + connect(connecttry,&trytry::try_one,this,&dispatch::f_one); + connect(connecttry,&trytry::connect_ok,[=](QString temp){emit connect_ok(temp);}); + connecttry->start(); + + jindu=(quint16)(((qfloat16)(now_scan)/(qfloat16)(scantimes))*100); + if(jindu!=jindu_old) + { + jindu_old=jindu; + //qDebug() <now_thread_num>this->set_thread_num); + + } + + + } } + + emit dispatch_finish(); } diff --git a/ip_sacaner/scan_run.h b/ip_sacaner/scan_run.h index a11cc59..2f4f53b 100644 --- a/ip_sacaner/scan_run.h +++ b/ip_sacaner/scan_run.h @@ -11,6 +11,22 @@ #include #include #include +#include +class trytryping : public QThread +{ + Q_OBJECT +public: + trytryping(); + + quint16 timeout; + QString ipstr; + + void run(); +signals: + void try_one(qint16); + void connect_ok(QString); + +}; class trytry : public QThread { @@ -44,8 +60,9 @@ public: QString port_list; trytry *connecttry; + trytryping *trytry_ping; - + bool pingonly=false; void run(); void f_one(qint16 temp); signals: diff --git a/ip_sacaner/widget.cpp b/ip_sacaner/widget.cpp index 0b80998..b09dccd 100644 --- a/ip_sacaner/widget.cpp +++ b/ip_sacaner/widget.cpp @@ -78,59 +78,84 @@ Widget::Widget(QWidget *parent) ui->outputlist->setReadOnly(true); ui->stard_scan->setText("start scan"); - connect(this,&Widget::start_scan,[=]{ - scan_flag=1; - keyboard_en(true); - ui->stard_scan->setText("stop scan"); - dispatch_thread = new dispatch;//线程分发 - dispatch_thread->ip_list=ui->IP_list->toPlainText(); - dispatch_thread->port_list=ui->port_list->toPlainText(); - dispatch_thread->set_thread_num = ui->threads->value(); - dispatch_thread->now_thread_num = 0; - dispatch_thread->timeout = ui->timeout->value(); - connect(dispatch_thread,&dispatch::dispatch_finish,[=]{ - emit stop_scan(); - }); - connect(dispatch_thread,&dispatch::return_jindu,this,&Widget::jindu_chuli,Qt::QueuedConnection); - connect(dispatch_thread,&dispatch::connect_ok,this,&Widget::output_chuli,Qt::QueuedConnection); - ui->progressBar->setValue(0); - dispatch_thread->start(); - ui->stard_scan->setDisabled(false); - }); - - connect(this,&Widget::stop_scan,[=]{ - scan_flag=0; - keyboard_en(false); - - ui->stard_scan->setText("start scan"); - - //dispatch_thread->disconnect(); - dispatch_thread->quit(); - dispatch_thread->wait(); - //delete dispatch_thread; - ui->stard_scan->setDisabled(false); - qDebug() << "tray_exit"; - - }); connect(ui->pushButton_20, &QPushButton::pressed, [=]() { - + if(scan_flag==0) + { + scan_flag=1; + keyboard_en(true); + ui->stard_scan->setDisabled(true); + ui->pushButton_20->setText("Stop Ping"); + dispatch_thread = new dispatch;//线程分发 + dispatch_thread->pingonly=true; + dispatch_thread->ip_list=ui->IP_list->toPlainText(); + dispatch_thread->port_list=ui->port_list->toPlainText(); + dispatch_thread->set_thread_num = ui->threads->value(); + dispatch_thread->now_thread_num = 0; + dispatch_thread->timeout = ui->timeout->value(); + connect(dispatch_thread,&dispatch::dispatch_finish,[=]{ + scan_flag=0; + keyboard_en(false); + ui->stard_scan->setDisabled(false); + ui->pushButton_20->setText("Ping Olny"); + dispatch_thread->quit(); + //dispatch_thread->wait(); + }); + connect(dispatch_thread,&dispatch::return_jindu,this,&Widget::jindu_chuli,Qt::QueuedConnection); + connect(dispatch_thread,&dispatch::connect_ok,this,&Widget::output_chuli,Qt::QueuedConnection); + ui->progressBar->setValue(0); + dispatch_thread->start(); + }else + { + scan_flag=0; + keyboard_en(false); + ui->stard_scan->setDisabled(false); + ui->pushButton_20->setText("Ping Olny"); + dispatch_thread->terminate(); + dispatch_thread->quit(); + //dispatch_thread->wait(); + } }); connect(ui->stard_scan, &QPushButton::pressed, [=]() { - ui->stard_scan->setDisabled(true); if(scan_flag==0) { - emit start_scan(); + scan_flag=1; + keyboard_en(true); + ui->pushButton_20->setDisabled(true); + ui->stard_scan->setText("stop scan"); + dispatch_thread = new dispatch;//线程分发 + dispatch_thread->pingonly=false; + dispatch_thread->ip_list=ui->IP_list->toPlainText(); + dispatch_thread->port_list=ui->port_list->toPlainText(); + dispatch_thread->set_thread_num = ui->threads->value(); + dispatch_thread->now_thread_num = 0; + dispatch_thread->timeout = ui->timeout->value(); + connect(dispatch_thread,&dispatch::dispatch_finish,[=]{ + scan_flag=0; + keyboard_en(false); + ui->pushButton_20->setDisabled(false); + ui->stard_scan->setText("start scan"); + dispatch_thread->quit(); + //dispatch_thread->wait(); + }); + connect(dispatch_thread,&dispatch::return_jindu,this,&Widget::jindu_chuli,Qt::QueuedConnection); + connect(dispatch_thread,&dispatch::connect_ok,this,&Widget::output_chuli,Qt::QueuedConnection); + ui->progressBar->setValue(0); + dispatch_thread->start(); }else { + scan_flag=0; + keyboard_en(false); + ui->pushButton_20->setDisabled(false); + ui->stard_scan->setText("start scan"); dispatch_thread->terminate(); - emit stop_scan(); - + dispatch_thread->quit(); + //dispatch_thread->wait(); } });//'scan button pass' diff --git a/ip_sacaner/widget.ui b/ip_sacaner/widget.ui index 400cf8c..0b82e39 100644 --- a/ip_sacaner/widget.ui +++ b/ip_sacaner/widget.ui @@ -81,7 +81,7 @@ 999 - 100 + 80