C#单线程和多线程的端口扫描器应用比较详解

C#单线程和多线程的端口扫描器应用比较详解

一、介绍

本文主要介绍C#单线程和多线程的端口扫描器应用比较,主要包括以下内容:

  1. 单线程端口扫描器原理及实现
  2. 多线程端口扫描器原理及实现
  3. 单线程与多线程端口扫描器的比较分析

二、单线程端口扫描器原理及实现

单线程端口扫描器是指只有一个线程去扫描指定的ip和端口。实现思路如下:

1. 获取目标ip地址和端口范围
2. 循环扫描指定的端口
3. 判断端口是否打开
4. 输出扫描结果

单线程端口扫描器的代码示例:

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

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("请输入要扫描的IP地址:");
            string strIP = Console.ReadLine();
            Console.WriteLine("请输入要扫描的端口范围,如:1-65535:");
            string strPort = Console.ReadLine();
            int startPort = Convert.ToInt32(strPort.Split('-')[0]);
            int endPort = Convert.ToInt32(strPort.Split('-')[1]);

            for (int i = startPort; i <= endPort; i++)
            {
                Console.Write("正在扫描端口{0}… ", i);
                TcpClient client = new TcpClient();
                try
                {
                    client.Connect(strIP, i);
                    Console.WriteLine("[+]端口{0}打开!", i);
                }
                catch
                {
                    Console.WriteLine("[-]端口{0}关闭!", i);
                }
                finally
                {
                    client.Close();
                }
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }
}

三、多线程端口扫描器原理及实现

多线程端口扫描器是指使用多个线程去扫描指定的ip和端口。实现思路如下:

1. 获取目标ip地址和端口范围
2. 将端口范围均分给多个线程
3. 每个线程循环扫描指定的端口
4. 判断端口是否打开
5. 输出扫描结果

多线程端口扫描器的代码示例:

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

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("请输入要扫描的IP地址:");
            string strIP = Console.ReadLine();
            Console.WriteLine("请输入要扫描的端口范围,如:1-65535:");
            string strPort = Console.ReadLine();
            int startPort = Convert.ToInt32(strPort.Split('-')[0]);
            int endPort = Convert.ToInt32(strPort.Split('-')[1]);

            int numThreads = endPort - startPort;
            ManualResetEvent[] doneEvents = new ManualResetEvent[numThreads];
            ScanPort[] scanPorts = new ScanPort[numThreads];
            int threadCount = 0;
            for (int i = startPort; i <= endPort; i++)
            {
                doneEvents[threadCount] = new ManualResetEvent(false);
                scanPorts[threadCount] = new ScanPort(strIP, i, doneEvents[threadCount]);
                Thread thread = new Thread(scanPorts[threadCount].Scan);
                thread.Start();
                threadCount++;
            }
            WaitHandle.WaitAll(doneEvents);
            foreach (ScanPort scanPort in scanPorts)
            {
                Console.Write("正在扫描端口{0}… ", scanPort.Port);
                if (scanPort.IsOpen)
                {
                    Console.WriteLine("[+]端口{0}打开!", scanPort.Port);
                }
                else
                {
                    Console.WriteLine("[-]端口{0}关闭!", scanPort.Port);
                }
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }

    class ScanPort
    {
        private string ip;
        private int port;
        private ManualResetEvent doneEvent;
        private bool isOpen;

        public ScanPort(string ip, int port, ManualResetEvent doneEvent)
        {
            this.ip = ip;
            this.port = port;
            this.doneEvent = doneEvent;
            this.isOpen = false;
        }

        public void Scan()
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(ip, port);
                isOpen = true;
            }
            catch { }
            finally
            {
                client.Close();
                doneEvent.Set();
            }
        }

        public bool IsOpen
        {
            get { return isOpen; }
        }

        public int Port
        {
            get { return port; }
        }
    }
}

四、单线程与多线程端口扫描器的比较分析

单线程端口扫描器和多线程端口扫描器都可以扫描目标ip的端口情况,但是具体应用中还是需要根据情况选择合适的扫描方式。比较分析如下:

1. 扫描速度

单线程端口扫描器只有一个线程去扫描,速度比较慢,当需要扫描多个端口时耗时较长。而多线程端口扫描器使用多个线程同时扫描,速度较快。

2. CPU占用率

单线程端口扫描器只占用一个CPU核心,CPU占用率不高,而多线程端口扫描器使用多个线程,CPU占用率较高。

3. 扫描精度

单线程端口扫描器只需要依次扫描每个端口,扫描精度较高,而多线程端口扫描器需要多个线程同时扫描,可能存在一些端口没有扫描到。

4. 扫描负载

单线程端口扫描器只使用一个线程,对目标主机的负载较小,而多线程端口扫描器使用多个线程,对目标主机的负载较大。

综上所述,单线程端口扫描器适合扫描少量的端口,多线程端口扫描器适合扫描大量的端口。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#单线程和多线程的端口扫描器应用比较详解 - Python技术站

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

相关文章

  • 初步认识C#中的Lambda表达式和匿名方法

    初步认识C#中的Lambda表达式和匿名方法 Lambda表达式 Lambda表达式是C# 3.0版本引入的新特性,可以看作是一个匿名函数,它可以传递到某些方法中,例如集合(List, Array)的Where() 方法。Lambda表达式允许您以更简洁的语法编写方法,从而使代码更简单易读。 Lambda表达式的语法格式为:(parameters) =&gt…

    C# 2023年6月1日
    00
  • C#安装OpenCvSharp4的实现步骤

    C#安装OpenCvSharp4的实现步骤可以大概分为以下几个步骤: 安装Visual StudioOpenCvSharp4需要依赖Visual Studio,因此需要先安装Visual Studio。可以从Microsoft官网下载对应版本的Visual Studio进行安装。 安装OpenCvSharp4 NuGet包在Visual Studio中,打开…

    C# 2023年6月3日
    00
  • C# Path.GetRandomFileName – 获取一个随机文件名

    Path.GetRandomFileName 方法是C#中的一个静态方法,其返回一个随机生成的文件名(不包含路径),该方法的作用是用于生成一个随机的文件名,以避免文件名的冲突问题。 使用该方法非常简单,只需要在代码中调用该静态方法即可,该方法的语法格式如下: public static string GetRandomFileName(); 该方法返回一个字…

    C# 2023年4月19日
    00
  • C# DataTable.Select()根据条件筛选数据问题

    C# DataTable类是一个非常强大的数据容器,通过Select方法可以选择满足筛选条件的数据行,并且将这些数据行返回到一个新的DataTable对象中。下面是使用DataTable.Select()方法根据条件筛选数据的完整攻略: 1. 准备数据表 首先,我们需要准备一个数据表,作为我们示例代码中的数据来源。可以使用如下代码创建一个名为”Student…

    C# 2023年6月6日
    00
  • c#连接mdf文件示例分享

    我们来详细讲解一下“C#连接MDF文件示例分享”的完整攻略。 什么是MDF文件? MDF文件是SQL Server数据库主文件的扩展名,它记录了SQL Server数据库的主要数据。在C#语言中,我们使用连接字符串来连接MDF文件,并进行数据库的相关操作。 连接MDF文件的准备工作 在进行连接操作之前,我们需要进行一些准备工作,这里有两个示例: 示例1:安装…

    C# 2023年5月31日
    00
  • C#面向对象编程中接口隔离原则的示例详解

    下面是针对“C#面向对象编程中接口隔离原则的示例详解”的完整攻略: 接口隔离原则(ISP)概述 ISP是指:不应该被强迫依赖那些他们不需要使用的接口。简单来说,该原则指出一个类或模块不应该依赖那些它不需要的接口,这样可以使得系统具有更好的松耦合性和更高的灵活性。 在C#编程中,接口往往是将一个大型的类分解成若干个更小的、更专一的类的重要手段。在使用接口的同时…

    C# 2023年5月31日
    00
  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

    C# 2023年6月1日
    00
  • Winform学生信息管理系统各子窗体剖析(3)

    首先需要明确一下,这篇文章是对Winform学生信息管理系统中各子窗体的剖析,本文分析的是第三部分,主要涉及的子窗体包括“学生公寓管理”、“学生缴费管理”、“学生考勤管理”和“学生成绩管理”。 学生公寓管理 学生公寓管理子窗体主要用于管理学生的住宿信息,包括宿舍楼、房间、住宿人员等信息。具体的功能如下: 宿舍楼管理:可以添加、修改、删除宿舍楼信息; 房间管理…

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