首先展示一下效果:

界面通过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 = );
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();
socket.abort();
socket.connectToHost(ip,tmpport);
if(socket.waitForConnected())
{ //qDebug()<<"connect";
text.lock();
QString message="";
message+=QString::number(tmpport,)+" 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();
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=;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();
for(int i=startport;i<=endport;i++)
{
socket.abort();
socket.connectToHost(ip,i);
if(socket.waitForConnected())
qDebug()<<i<<"connected!"; }
} void MainWindow::on_pushButton_2_clicked()
{
if(ui->pushButton_2->text()=="暂停")
{
bool couldPause=false;
for(int i=;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=;i<ui->spinBox_3->value();i++)
scanner[i].stop();
delete(scanner);
}

解释一下:

有三个互斥访问变量:当前任务端口nowport, 扫描结果 textEdit,进度条 progressBar。

在访问这三个变量的时候要用信号量实现互斥访问。

by nianhao@ouc,万一被查重了不负责。。

更新一波,增加网段扫描

首先是ip遍历函数:

int ip2num(QString ip)
{
bool ok;
int lp[];
QStringList iplist=ip.split('.');
for (int i=;i<iplist.length();i++)
lp[i]=iplist[i].toInt(&ok,);
return lp[] << | lp[] << | lp[] << | lp[];
} QString num2ip(int num)//:# int num to ip
{
int ip[];
ip[] = (num & 0xff);
ip[] = (num & 0xff00) >> ;
ip[] = (num & 0xff0000) >> ;
ip[] = (num & 0xff000000) >> ;
QString rip=QString("%1").arg(ip[])+QString(".")+QString("%1").arg(ip[])+QString(".")+QString("%1").arg(ip[])+QString(".")+QString("%1").arg(ip[]);
return rip;
} bool iprange(QString ip1,QString ip2)
{
int num1 = ip2num(ip1);
int num2 = ip2num(ip2);
sip=num1;
eip=num2; int tmp = num2 - num1;
if(tmp < )
return false;
else
return true;
}

通过位运算遍历ip地址。

然后我们修改一下run函数,给线程分配任务时同时给定ip,这样实现ip的遍历void Scanner::run()

{
while(!stopped)
{
mutex.lock();
QString tmpIp=nowIp;
if(nowport>endport||nip>eip)
{
if(nip>eip)
{
mutex.unlock();
emit sentnowport(endport);
break;
}
nip++;
emit sentnowip(nip);
nowIp=num2ip(nip);
QString msg=QString("now the scanning ip is %1").arg(nowIp);
if(nip<=eip)
result->append(msg);
nowport=staport;
} int tmpport=nowport++; //发出更新进度条信号
emit sentnowport(nowport);
mutex.unlock(); //尝试tcp连接
QTcpSocket socket();
socket.abort();
socket.connectToHost(tmpIp,tmpport);
if(socket.waitForConnected())
{ //qDebug()<<"connect";
text.lock();
QString message="";
message+=QString::number(tmpport,)+" opened!";
result->append(message);
text.unlock();
//qDebug()<<"connect over";
} else
;//qDebug()<<tmpport<<"not open"<<endl; }
stopped=false;
}

最后修改一下界面文件,增加一个指示全局进度的进度条。

最终效果:

这样就完成了网络安全的实验了。

整个项目的源代码:点击这里

密码:w1lh

大家好好复习欢迎给我发期末重点啊,赠人玫瑰~~~香的不行

Qt实现端口扫描器的更多相关文章

  1. Python3实现TCP端口扫描器

    本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...

  2. Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器

    1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...

  3. 端口扫描器——ZenmapKail Linux渗透测

    3.3  端口扫描器——ZenmapKail Linux渗透测​ Zenmap(端口扫描器)是一个开放源代码的网络探测和安全审核的工具.它是Nmap安全扫描工具的图形界面前端,它可以支持跨平台.使用Z ...

  4. 达内培训:php在线端口扫描器

    达内培训:php在线端口扫描器 [来源] 达内    [编辑] 达内   [时间]2012-12-21 这个扫描器很简单.就是用了一个数组来定义端口的相关信息,原理就是用fsockopen函数连接,如 ...

  5. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  6. 『Python』 多线程 端口扫描器

    0x 00 Before Coding 当端口打开时,向端口发送 TCP SYN 请求,会返回一个 ACK 响应: 当端口关闭,返回的是 RST 响应: 0x 01 Coding  可以用 socke ...

  7. mac/unix系统:C++实现一个端口扫描器

    在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件, 编译环境为Mac, 系统版本10.11.6: #include < ...

  8. 【技术分享】手把手教你使用PowerShell内置的端口扫描器

    [技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerS ...

  9. python端口扫描器

    吃了个火鸡面后感觉到了怀疑人生!!!!!!!!!妈耶,在也不吃了.思路都给辣没了!!! python端口扫描器代码如下: #-*-coding:utf-8 from socket import * i ...

随机推荐

  1. 关于JSF中immediate属性的总结(三)

    Okay, when should I use the immediate attribute? If it isn't entirely clear yet, here's a summary, c ...

  2. .Net Core 杂记

    在学习.net core的路上,遇到很多坑,慢慢了解了.net core设计理念和设计思想(纯属跟人理解). 再此整理了之前写的一些学习笔记,后续也会把新的学习新的加上. 1..net core 跨平 ...

  3. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  4. R语言作为BI中ETL的工具

    R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...

  5. 改变win7驱动图标

    一.背景 自己做的USB设备是HID设备,注册到设备管理器中就是"HID Compliant device",显得很业余,然后想去改变这个图标和名称,也就有了此篇文章 二.正文 还 ...

  6. JDBC值事务

    事务的四大特性: 原子性, 一致性(比如说A给B转账,A转了之后B的账户增加了,两个都完成才叫一致性),隔离性(A给B转账,A给C转账,AB和AC并发是无关的),永久性(转账之后 不可能复原,就是说不 ...

  7. 由表单验证说起,关于在C#中尝试链式编程的实践

    在web开发中必不可少的会遇到表单验证的问题,为避免数据在写入到数据库时出现异常,一般比较安全的做法是前端会先做一次验证,通过后把数据提交到后端再验证一次,因为仅仅靠前端验证是不安全的,有太多的htt ...

  8. LCQCL

    Linux Command Quick Check List 记录一些我Linux使用中的问题的解决方案. # 挂起: 几乎只对RAM供电以保存工作状态的极低能耗状态. 任意键或电源键退出(主要看RP ...

  9. grep-2.26 sed-4.2.2 awk-4.1.4 wget-1.18 pcregrep-8.39 pcre2grep-10.22 for windows 最新版本静态编译

    -------------------------------------------------------------------------------------------- grep (G ...

  10. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...