C#端口扫描器的编写方法
作者:永远爱mai 时间:2023-12-17 17:47:24
本文实例为大家分享了C#端口扫描器的编写代码,供大家参考,具体内容如下
一、项目设计
新建项目
整体设计
最终设计
二、单线程
1.代码编写
button
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 duankou
{
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 label1_Click(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
try
{
//初始化
tbShow.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;
//显示框显示
tbShow.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;
else
return false;
}
private void PortScan()
{
double x;
string xian;
//显示扫描状态
tbShow.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;
}
tbShow.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);
//扫描到则显示到显示框
tbShow.AppendText("端口 " + port + " 开放!" + Environment.NewLine);
}
catch
{
//未扫描到,则会抛出错误
}
}
}
}
2.扫描结果
开始
1分钟结束 没有端口开放
三、多线程
1.代码编写
button
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 duankou
{
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 label1_Click(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
try
{
//初始化
tbShow.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;
//创建线程,并创建ThreadStart委托对象
Thread process = new Thread(new ThreadStart(PortScan));
process.Start();
//设置进度条的范围
pb.Minimum = start;
pb.Maximum = end;
//显示框显示
tbShow.AppendText("端口扫描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
}
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;
else
return false;
}
private void PortScan()
{
double x;
string xian;
//显示扫描状态
tbShow.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);
}
tbShow.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);
//扫描到则显示到显示框
tbShow.AppendText("端口 " + port + " 开放!" + Environment.NewLine);
}
catch
{
//未扫描到,则会抛出错误
}
}
}
}
2.扫描结果
开始
5秒结束
小结
多线程能够有更好的CPU使用率,程序设计更简单,更快的程序响应速度。
链接
C#单线程和多线程端口扫描器
来源:https://blog.csdn.net/x1359640470/article/details/121548864
标签:C#,端口扫描器
0
投稿
猜你喜欢
编写Java代码对HDFS进行增删改查操作代码实例
2023-07-08 11:46:42
Java中的javaBean、vo、entity、domain和pojo
2023-03-30 21:41:20
c#可以创建任意控件的拖动方法
2021-11-30 01:51:08
Kotlin使用TransitionDrawable实现颜色渐变效果流程讲解
2023-03-28 06:54:08
Android studio 去除版本控制教程
2022-03-21 20:39:43
使用SpringBoot 配置Oracle和H2双数据源及问题
2023-10-04 14:06:11
使用spring框架中的组件发送邮件功能说明
2022-12-29 03:53:55
Java动态 代理和AOP应用示例
2023-11-26 07:45:02
举例讲解Java设计模式编程中Decorator装饰者模式的运用
2023-01-13 03:17:00
C#实现根据指定容器和控件名字获得控件的方法
2023-09-26 12:23:03
C语言实现模拟银行系统
2022-01-17 08:40:27
Java黑盒测试之nextDate函数测试
2023-02-10 20:31:08
解决myBatis generator逆向生成没有根据主键的select,update和delete问题
2022-05-13 06:18:56
java 中HashCode重复的可能性
2021-09-13 17:38:05
Jenkins的安装配置详解
2023-08-27 11:31:42
一文带你了解如何正确使用Java中的字符串常量池
2022-07-13 01:35:30
idea 实现搜索jdk中的类和包操作
2022-06-02 22:54:47
Jetpack Compose 的新型架构 MVI使用详解
2023-01-24 14:53:26
基于Java随机生成手机短信验证码的实例代码
2023-12-22 02:50:49
解决RabbitMq消息队列Qos Prefetch消息堵塞问题
2021-11-17 17:36:13