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#斐波那契数列(Fibonacci)(递归,非递归)实现代码

    C#中可以使用递归和非递归两种方式实现斐波那契数列。 一、递归实现代码 递归实现斐波那契数列比较简单,代码如下: public static int Fibonacci_Recursive(int n) { if (n <= 0) { return 0; } if (n == 1 || n == 2) { return 1; } return Fibo…

    C# 2023年5月31日
    00
  • 魔兽世界8.3新版本橙装幻化规则是什么 魔兽世界8.3橙装幻化规则介绍

    魔兽世界8.3新版本橙装幻化规则是什么 摘要 本篇攻略主要讲述魔兽世界8.3新版本橙装幻化规则。橙装幻化是一种帮助玩家外观扮靓,无需牺牲实用性的功能。本攻略将深入介绍橙装幻化的获取方法和具体规则。 橙装幻化获取方法 装备橙色装备:在8.3版本中,所有橙色装备都自带幻化属性。只要装备了橙色装备,玩家就可以自动获得该装备的幻化,而无需使用专门的幻化物品进行幻化。…

    C# 2023年5月31日
    00
  • 浅谈c#中config.exe 引发的一些问题

    浅谈c#中config.exe 引发的一些问题 背景 在C#中,config.exe是一个重要的配置文件。一般情况下,config.exe是用于配置程序中的各种参数(例如数据库连接字符串等等)。然而,在实际开发中,我们会发现config.exe可能会引发一些问题,这篇文章就是针对这些问题进行讨论,并提供相应解决方案。 问题 问题1:路径问题 在一些情况下,c…

    C# 2023年6月7日
    00
  • string类的使用方法详解

    string类的使用方法详解 什么是string类 string是c++STL中的一个类,用来存放字符串。它是C++的标准库中的一员,被定义在头文件中。与字符数组相比,string类具有动态性、可扩展性和自动管理内存等优点。 string类的基本用法 头文件引入 要使用string类,我们需要在C++代码中引入头文件 #include <string&…

    C# 2023年6月8日
    00
  • 详解C#如何实现隐式类型转换

    下面是详解C#如何实现隐式类型转换的完整攻略: 标题:C#隐式类型转换详解 什么是隐式类型转换 在C#中,隐式类型转换是指将一种数据类型的值自动转换为另一种数据类型,无需显式地指定转换类型。通常情况下,隐式类型转换会自动执行,这样可以方便地在不同类型之间进行赋值、比较等操作。 哪些数据类型可以进行隐式类型转换 C#中只有一部分数据类型可以进行隐式类型转换,主…

    C# 2023年6月1日
    00
  • 详解如何在C#中接受或拒绝Excel中的修订

    如何在C#中接受或拒绝Excel中的修订 为了接受或拒绝Excel文档中的修订,我们需要使用C#中的Microsoft.Office.Interop.Excel库。下面是实现此目的的步骤: 步骤1:在Visual Studio中创建C#项目,并添加对Microsoft.Office.Interop.Excel库的引用 步骤2:打开Excel文档 为了打开Ex…

    C# 2023年6月6日
    00
  • 用JSON做数据传输格式中的一些问题总结

    下面是关于“用JSON做数据传输格式中的一些问题总结”的完整攻略,包含两个示例。 1. 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript语言的一个子集,但是可以被多种编程语言使用。JSON格式的数据可以被轻松地解析和生成,因此在Web应用程序中广泛使用。 2…

    C# 2023年5月15日
    00
  • C#简单的特殊输出实例

    接下来我将为您详细讲解使用C#实现特殊输出的方法。 1. 基础知识 在C#中,我们可以使用Console.WriteLine()方法来输出字符串,并使用{}将变量括起来输出变量的值。 例如: int age = 18; Console.WriteLine("My age is {0}", age); 输出结果为:My age is 18 …

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