基于C#实现端口扫描器(单线程和多线程)

基于C#实现端口扫描器(单线程和多线程)

端口扫描器是渗透测试和网络安全领域中一个非常重要的工具,它用于发现网络主机上开放的TCP/UDP端口。本文将基于C#实现一个简单的端口扫描器并探讨如何使用单线程和多线程技术来提高效率。

端口扫描器实现流程

  1. 解析待扫描主机的IP地址和端口范围
  2. 循环遍历端口范围,尝试向目标主机的每个端口发送TCP或UDP连接请求
  3. 根据返回结果,确定目标主机上的端口是否开放

单线程实现端口扫描器

下面是基于单线程的端口扫描器实现代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace SimplePortScanner
{
    class Program
    {
        static void Main(string[] args)
        {
            string host = "127.0.0.1"; // 待扫描主机
            int startPort = 1000; // 起始端口
            int endPort = 2000; // 结束端口

            for (int port = startPort; port <= endPort; port++)
            {
                try
                {
                    TcpClient client = new TcpClient();
                    client.Connect(host, port);
                    Console.WriteLine($"Port {port}: OPEN");
                    client.Close();
                }
                catch (SocketException)
                {
                    Console.WriteLine($"Port {port}: CLOSED");
                }
            }
        }
    }
}

在该实现中,我们通过循环遍历给定的端口范围,使用TcpClient发送TCP连接请求并捕获可能的异常信息来判断目标主机上的端口是否开放。

多线程实现端口扫描器

下面是基于多线程技术的端口扫描器实现代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MultiThreadPortScanner
{
    class Program
    {
        static void Main(string[] args)
        {
            string host = "127.0.0.1"; // 待扫描主机
            int startPort = 1000; // 起始端口
            int endPort = 2000; // 结束端口
            int threadCount = 10; // 线程数

            int perThreadPorts = (endPort - startPort + 1) / threadCount;

            for (int i = 0; i < threadCount; i++)
            {
                int start = startPort + perThreadPorts * i;
                int end = i == threadCount - 1 ? endPort : start + perThreadPorts - 1;

                ThreadPool.QueueUserWorkItem(new WaitCallback(ScanPorts), new PortRange(host, start, end));
            }

            Console.ReadLine();
        }

        static void ScanPorts(object state)
        {
            PortRange range = (PortRange)state;

            for (int port = range.StartPort; port <= range.EndPort; port++)
            {
                try
                {
                    TcpClient client = new TcpClient();
                    client.Connect(range.Host, port);
                    Console.WriteLine($"Port {port}: OPEN");
                    client.Close();
                }
                catch (SocketException)
                {
                    Console.WriteLine($"Port {port}: CLOSED");
                }
            }
        }
    }

    class PortRange
    {
        public string Host { get; set; }
        public int StartPort { get; set; }
        public int EndPort { get; set; }

        public PortRange(string host, int start, int end)
        {
            Host = host;
            StartPort = start;
            EndPort = end;
        }
    }
}

该实现中,我们使用线程池来创建多个工作线程,并将端口范围分配给不同的线程进行扫描。每个工作线程使用一个PortRange对象来存储其分配到的端口范围。这里我们假设待扫描的端口数量可以被线程数整除,因此每个工作线程的端口范围大小相等。

示例

假设我们的目标主机为127.0.0.1,起始端口为1000,结束端口为2000。我们可以运行上述代码来进行端口扫描。

如果运行单线程端口扫描器,输出结果如下:

Port 1000: CLOSED
Port 1001: CLOSED
Port 1002: CLOSED
...(省略中间部分)...
Port 1998: CLOSED
Port 1999: CLOSED
Port 2000: CLOSED

我们可以看到,单线程扫描整个端口范围需要一定的时间,因此效率较低。

相比之下,如果运行多线程端口扫描器,输出结果如下:

Port 1000: CLOSED
Port 1001: CLOSED
Port 1002: CLOSED
Port 1003: CLOSED
Port 1004: CLOSED
Port 1005: CLOSED
Port 1006: CLOSED
Port 1007: CLOSED
Port 1008: CLOSED
Port 1009: CLOSED
Port 1010: CLOSED
Port 1011: CLOSED
Port 1012: CLOSED
Port 1013: CLOSED
Port 1014: CLOSED
Port 1015: CLOSED
Port 1016: CLOSED
Port 1017: CLOSED
Port 1018: CLOSED
...(省略中间部分)...
Port 1998: CLOSED
Port 1999: CLOSED
Port 2000: CLOSED

我们可以看到,多线程扫描效率显著提高,输出结果出现得更快。

这就是关于基于C#实现端口扫描器(单线程和多线程)的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C#实现端口扫描器(单线程和多线程) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • .Net Core 多文件打包压缩的实现代码

    .NET Core 多文件打包压缩的实现代码 在.NET Core应用程序中,有时需要将多个文件打包成一个压缩文件,以便于传输或存储。在本攻略中,我们将介绍如何使用C#代码实现多文件打包压缩,并提供两个示例说明。 1. 使用System.IO.Compression命名空间 在.NET Core应用程序中,可以使用System.IO.Compression命…

    C# 2023年5月16日
    00
  • 详解C#中委托的概念与使用

    详解C#中委托的概念与使用 委托的概念 委托是一种类型,它可以用于封装方法、函数或Lambda表达式,并将其作为参数传递给其他方法。委托可以理解为是一个函数指针,它指向一个特定的方法。 委托是一个类,定义了一个方法的签名,可以指向任何函数,只要这个函数的参数列表和返回值类型与该委托的签名相同。C#中的委托必须先声明后使用,声明委托格式如下: delegate…

    C# 2023年6月7日
    00
  • C#中使用强制类型实现字符串和ASCII码之间的转换

    C#中可以通过强制类型转换实现字符串和ASCII码之间的相互转换。下面是具体的步骤: 1.字符串转ASCII码 将字符串转成ASCII码需要使用Encoding.ASCII.GetBytes()方法,具体步骤如下: 通过Encoding.ASCII获取ASCII编码对象; 将需要转换的字符串通过Encoding.ASCII.GetBytes()方法转换成字节…

    C# 2023年6月7日
    00
  • C#迭代器方法介绍

    下面就是关于C#迭代器方法介绍的完整攻略。 什么是迭代器方法 迭代器是一种C#语言中的一种特殊方法,它允许我们以可枚举的方式迭代访问集合中的元素,而不必浪费时间和内存将整个集合复制到数组中。 如何编写迭代器方法 要编写一个迭代器方法,只需要使用yield关键字,将一个或多个元素作为集合的成员返回。这将构建时序集合,每个调用将返回它的下一个元素。在没有更多元素…

    C# 2023年5月15日
    00
  • C#实现打造气泡屏幕保护效果

    C#实现打造气泡屏幕保护效果 屏幕保护程序是许多电脑用户在闲暇时间会看到的一个漂亮而且有趣的应用。在这篇攻略中,我们将探讨如何使用C#编写一个简单的气泡屏保程序。本示例基于.NET Framework 4.7.1。 步骤1. 创建项目 首先,打开Visual Studio,从“文件”菜单中选择“新建项目”。在弹出的窗口中,选择“Visual C#”和“Win…

    C# 2023年5月31日
    00
  • C# File.Delete()方法: 删除指定的文件

    C#的File.Delete()作用和使用方法 作用 File.Delete()方法用于删除指定路径的文件。如果文件不存在,则不会发生任何操作。 使用方法 File.Delete()方法的使用语法如下: File.Delete("path"); 其中path参数是待删除的文件路径,可以是绝对路径或相对路径。 以下是删除文件的基本流程: 调…

    C# 2023年4月19日
    00
  • vs2015浮点数计算怎么提高数据精度?

    想要提高VS2015中浮点数计算的数据精度,可以尝试以下几种方法: 1.使用高精度浮点数库 在C++标准库中,对于浮点数计算,可使用<boost/multiprecision>库中的高精度浮点数类型cpp_dec_float类进行计算。该类使用了基于任意精度算法的十进制算术来进行精度计算。下面是一个示例: #include <boost/m…

    C# 2023年6月6日
    00
  • C#实现统计字数功能的方法

    下面是“C#实现统计字数的功能”的完整攻略: 一、需求分析 在进行编码之前,我们需要先分析需求,明确要实现的功能。在这个任务中,我们需要实现统计一段文本中包含的字符数和单词数的功能。 字符数的统计比较简单,只需要计算文本长度即可。而对单词数的统计涉及到对文本内容的分词和统计,需要采用一定的算法实现。 二、实现步骤 1. 统计字符数 要统计字符数,首先需要获取…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部