C#单线程和多线程的端口扫描器应用比较详解
一、介绍
本文主要介绍C#单线程和多线程的端口扫描器应用比较,主要包括以下内容:
- 单线程端口扫描器原理及实现
- 多线程端口扫描器原理及实现
- 单线程与多线程端口扫描器的比较分析
二、单线程端口扫描器原理及实现
单线程端口扫描器是指只有一个线程去扫描指定的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技术站