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#内置队列类Queue用法实例

    C#内置队列类Queue用法实例 本文将详细讲解C#内置队列类Queue的用法,包括如何创建队列、添加元素、删除元素、获取队列中元素数量等操作。 创建和初始化队列 在C#中,可以使用Queue类来创建一个队列。T代表存储在队列中的元素类型。我们可以在创建队列的同时指定元素类型,也可以在后续操作中动态添加元素类型。下面是一个创建包含整数的队列的示例: Queu…

    C# 2023年6月7日
    00
  • Fastjson 常用API介绍及下载地址(推荐)

    Fastjson 常用 API 介绍及下载地址(推荐) 介绍 Fastjson是一个Java语言编写的高性能JSON处理器,它可以将Java对象转换为JSON,也可以将JSON转换为Java对象,并且速度非常快,被广泛应用于各种Java Web应用中。Fastjson的优势在于比其他的json处理器更快。 下载地址 Fastjson的下载地址:https:/…

    C# 2023年5月31日
    00
  • C#实现倒计时关闭提示框功能

    下面是“C#实现倒计时关闭提示框功能”的完整攻略: 步骤一:创建提示框 在窗体上拖拽一个 Label 控件,设置样式和位置,并将其名称设为 tipsLabel。在窗体加载时使用以下代码显示提示框: tipsLabel.Visible = true; // 显示提示框 步骤二:实现倒计时 定义一个整型变量 countdownTime,并在窗体加载时初始化为需要…

    C# 2023年6月1日
    00
  • ASP.NET中HiddenField隐藏域控件的使用方法

    下面是ASP.NET中HiddenField隐藏域控件的使用方法攻略。 一、什么是HiddenField隐藏域控件 HiddenField隐藏域控件是ASP.NET Web表单中的一个服务器端控件,它会生成一个HTML隐藏域,可以用于在Web页面中存储一些不希望被用户看到的数据,比如一些服务器端的数据。 二、HiddenField隐藏域控件的使用方法 1. …

    C# 2023年6月3日
    00
  • 通过C#编写一个简易的Windows截屏增强工具

    一、前言 在本篇攻略中,我们将详细讲解如何使用C#编写一个简易的Windows截屏增强工具。该工具可以实现采集屏幕截图、标注图片、保存图片等功能,为用户提供更加便捷的截屏体验。 二、环境准备 在开始编写代码前,我们需要准备如下环境:- Windows操作系统- Visual Studio 2019开发环境- .NET Framework 4.7.2运行库 三…

    C# 2023年5月15日
    00
  • Unity实现轮盘方式的按钮滚动效果

    下面是实现“Unity实现轮盘方式的按钮滚动效果”的攻略。 步骤一:创建UI布局 首先,我们需要创建一个包含多个按钮的UI布局。具体操作步骤如下: 在Unity编辑器中,打开场景视图,并点击“Create”->“UI”->“Canvas”创建一个UI画布。 在画布中,创建一个Panel对象,用来存放按钮。 在Panel对象中添加一个Vertica…

    C# 2023年6月3日
    00
  • C# 导出Excel的6种简单方法实现

    下面开始详细讲解“C# 导出Excel的6种简单方法实现”的完整攻略。 准备工作 在进行下面操作之前,我们需要下载并安装EPPlus包。EPPlus是一个开源的Excel类库,它允许我们在C#中轻松访问和修改Excel文件。你可以从NuGet官网下载EPPlus包。 方法一:使用Microsoft.Office.Interop.Excel Microsoft…

    C# 2023年6月1日
    00
  • Winform学生信息管理系统主页面设计(2)

    Winform学生信息管理系统主页面设计(2) 在Winform学生信息管理系统的主页面设计部分,我们将主要关注以下几个方面:主页面布局设计、主页面控件设计及其事件处理等内容。 主页面布局设计 主页面布局设计是整个Winform学生信息管理系统的基础,当我们确定好主页面的结构及各个控件的位置后,系统的后续开发工作才能有序展开。 主页面布局设计示例1 以下是一…

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