目录

  • 一、项目创建
    • 1. 创建项目
    • 2. 界面设计
  • 二、单线程实现端口扫描
    • 1. 代码准备
    • 2. 运行结果
  • 三、多线程实现端口扫描
    • 1. 代码准备
    • 2. 运行结果
  • 四、总结
  • 五、参考

一、项目创建

1. 创建项目

  1. 在VS2019中新建一个Windows窗体项目应用(.Net Framework)
  2. 设置项目名和路径:


    创建成功

2. 界面设计

  • 将输出窗口设置成只读模式:

二、单线程实现端口扫描

1. 代码准备

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinForms
{public partial class Form1 : Form{//主机地址private string hostAddress;//起始端口private int start;//终止端口private int end;//端口号private int port;//定义线程对象private Thread scanThread;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){try{//初始化show.Clear();lb.Text = "0%";//获取ip地址和始末端口号hostAddress = tbHost.Text;start = Int32.Parse(tbSPort.Text);end = Int32.Parse(tbEPort.Text);if (decideAddress()) // 端口合理{//让输入的textbox只读,无法改变tbHost.ReadOnly = true;tbSPort.ReadOnly = true;tbEPort.ReadOnly = true;//设置进度条的范围pb.Minimum = start;pb.Maximum = end;//显示框显示show.AppendText("端口扫描器 v1.0.0" + Environment.NewLine + Environment.NewLine);//调用端口扫描函数PortScan();}else{//若端口号不合理,弹窗报错MessageBox.Show("输入错误,端口范围为[0-65536]!");}}catch{//若输入的端口号为非整型,则弹窗报错MessageBox.Show("输入错误,端口范围为[0-65536]!");}}/// <summary>/// 判断端口是否合理/// </summary>/// <returns></returns>private bool decideAddress(){//判断端口号是否合理if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))return true;elsereturn false;}private void PortScan(){double x;string xian;//显示扫描状态show.AppendText("开始扫描...(可能需要请您等待几分钟)" + Environment.NewLine + Environment.NewLine);//循环抛出线程扫描端口for (int i = start; i <= end; i++){x = (double)(i - start + 1) / (end - start + 1);xian = x.ToString("0%");port = i;//调用端口i的扫描操作Scan();//进度条值改变lb.Text = xian;lb.Refresh();pb.Value = i;}show.AppendText(Environment.NewLine + "扫描结束!" + Environment.NewLine);//输入框textbox只读属性取消tbHost.ReadOnly = false;tbSPort.ReadOnly = false;tbEPort.ReadOnly = false;}/// <summary>/// 扫描某个端口/// </summary>private void Scan(){int portnow = port;//创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接TcpClient objTCP = null;try{//用于TcpClient对象扫描端口objTCP = new TcpClient(hostAddress, portnow);//扫描到则显示到显示框show.AppendText("端口 " + port + " 开放!" + Environment.NewLine);}catch{//未扫描到,则会抛出错误}}}
}

2. 运行结果

速度十分缓慢:

三、多线程实现端口扫描

1. 代码准备

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinForms
{public partial class Form1 : Form{//主机地址private string hostAddress;//起始端口private int start;//终止端口private int end;//端口号private int port;//定义线程对象private Thread scanThread;//定义端口状态数据(开放则为true,否则为false)private bool[] done = new bool[65526];private bool OK;public Form1(){InitializeComponent();//不进行跨线程检查CheckForIllegalCrossThreadCalls = false;}private void button1_Click(object sender, EventArgs e){try{//初始化show.Clear();lb.Text = "0%";//获取ip地址和始末端口号hostAddress = tbHost.Text;start = Int32.Parse(tbSPort.Text);end = Int32.Parse(tbEPort.Text);if (decideAddress()) // 端口合理{//让输入的textbox只读,无法改变tbHost.ReadOnly = true;tbSPort.ReadOnly = true;tbEPort.ReadOnly = true;//设置进度条的范围pb.Minimum = start;pb.Maximum = end;//显示框显示show.AppendText("端口扫描器 v1.0.0" + Environment.NewLine + Environment.NewLine);//调用端口扫描函数PortScan();}else{//若端口号不合理,弹窗报错MessageBox.Show("输入错误,端口范围为[0-65536]!");}}catch{//若输入的端口号为非整型,则弹窗报错MessageBox.Show("输入错误,端口范围为[0-65536]!");}}/// <summary>/// 判断端口是否合理/// </summary>/// <returns></returns>private bool decideAddress(){//判断端口号是否合理if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))return true;elsereturn false;}private void PortScan(){double x;string xian;//显示扫描状态show.AppendText("开始扫描...(可能需要请您等待几分钟)" + Environment.NewLine + Environment.NewLine);//循环抛出线程扫描端口for (int i = start; i <= end; i++){x = (double)(i - start + 1) / (end - start + 1);xian = x.ToString("0%");port = i;//使用该端口的扫描线程scanThread = new Thread(new ThreadStart(Scan));scanThread.Start();//使线程睡眠System.Threading.Thread.Sleep(100);//进度条值改变lb.Text = xian;pb.Value = i;}while (!OK){OK = true;for (int i = start; i <= end; i++){if (!done[i]){OK = false;break;}}System.Threading.Thread.Sleep(1000);}show.AppendText(Environment.NewLine + "扫描结束!" + Environment.NewLine);//输入框textbox只读属性取消tbHost.ReadOnly = false;tbSPort.ReadOnly = false;tbEPort.ReadOnly = false;}/// <summary>/// 扫描某个端口/// </summary>private void Scan(){int portnow = port;//创建线程变量Thread Threadnow = scanThread;//扫描端口,成功则写入信息done[portnow] = true;//创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接TcpClient objTCP = null;try{//用于TcpClient对象扫描端口objTCP = new TcpClient(hostAddress, portnow);//扫描到则显示到显示框show.AppendText("端口 " + port + " 开放!" + Environment.NewLine);}catch{//未扫描到,则会抛出错误}}}
}

2. 运行结果

速度明显比单线程快

四、总结

  本文通过编写端口扫描器程序,分别采用单一进程和多线程方式,并对比两者的效果。

五、参考

https://blog.csdn.net/ssj925319/article/details/109688125

【C#】C#实现端口扫描器相关推荐

  1. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享

    #!/usr/bin/env python import socket if __name__=='__main__': port=3389 s=socket.socket() for cnt in ...

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

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

  3. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现("ping扫描")和端口扫描. 旧的2.x版本只有Windo ...

  4. Python3实现TCP端口扫描器

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

  5. 实例探究Python以并发方式编写高性能端口扫描器的方法

    来源:http://www.jb51.net/article/86615.htm 关于端口扫描器 端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于 ...

  6. 蓝蛇端口扫描器 v2.8.4.724

    简介: 蓝蛇端口扫描器--一款快速.专业.灵活.好用的端口扫描软件,蓝蛇端口扫描器是在原有v1.0的基础上升级打造而成.它不仅具备原有的面向IP扫描功能,还实现了面向端口扫描.此外,开放原有的端口字典 ...

  7. python调用扫描仪_使用Python编写简单的端口扫描器的实例分享

    单线程实现单线程实现道理比较简单,这里尝试Soket连接3389,连接成功说明端口开放,否则说明没有开远程服务.随便修改了一下就ok了,代码如下,最终得到自己的IP地址. #!/usr/bin/env ...

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

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

  9. 使用python-nmap 搭建基本端口扫描器

    代码地址如下: http://www.demodashi.com/demo/13255.html 一.前言 注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担 ...

  10. 小小黑客之路(一)——端口扫描器

    在之前了解过黑客,曾经在网易上写过一篇关于黑客的文章--<黑客初识>,由于各种原因没有继续学习去,由于前几天的机房讲课,又激起我那不安的心,故找到一本<小小黑客之路>进行学习. ...

最新文章

  1. 使用opencv dnn 模块调用darknet模型时候出错,不支持relu激活函数
  2. linux下数据库的基本管理,数据库的管理_linux 运维之道 基础篇的技术博客_51CTO博客...
  3. linux挂载分区至目录
  4. c++类与类之间关系
  5. java web面试_超实用的Java web面试题
  6. 为嵌入式对象(值对象)加校验
  7. leetcode49. 字母异位词分组
  8. 在GCC和Visual Studio中使用hash_map
  9. java存钱_用Java编写银行存钱取钱
  10. ta leader是什么岗位_干货 丨 八卦下,应届/实习生应该跟什么样的leader?
  11. ios模拟器键盘不弹出
  12. JAVA反射系列之Method,java.lang.reflect.Method的使用。
  13. linux系统sql语句报错_linux之SQL语句简明教程---CREATE VIEW
  14. 如何在Macbook安装Linux双系统
  15. 【数学建模】元胞自动机
  16. java win10窗口启动假死_win10系统下桌面经常假死如何解决
  17. [Leetcode] 448. Find All Numbers Disappeared in an Array 解题报告
  18. POJ1260 Pearls(多重捆绑成0-1背包)
  19. android点击按钮执行adb命令,Android 按键事件及adb命令模拟
  20. 于是,我搭了个自己的博客网站

热门文章

  1. TortoiseSVN配置
  2. Java的“跨平台”特性
  3. python基础刻意练习--Task 6 字典与集合
  4. html 各大网站分享代码
  5. 信用卡欺诈检测数据集
  6. JPA ObjectDeletedException: deleted instance passed to merge
  7. 2015年2月8日工作日志------赵鑫
  8. 开源虚拟机工具_使用开源工具与虚拟乐高玩
  9. 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
  10. 用手机怎么看服务器里的文件,手机查看云服务器文件