// работа на тему Информационная безопасность
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
class Program
{
private static string IP = "";
static void Main(string[] args)
{
Console.Title = "PortScanner";
UserInput();
PortScan();
Console.ReadKey();
}
private static void UserInput()
{
Console.Write("IP Address:", ConsoleColor.White);
IP = Console.ReadLine();
}
private static void PortScan()
{
Console.Clear();
TcpClient Scan = new TcpClient();
foreach (int s in Ports)
{
try
{
Scan.Connect(IP, s);
Console.WriteLine($"[{s}] | OPEN", ConsoleColor.Green);
}
catch
{
Console.WriteLine($"[{s}] | CLOSED", ConsoleColor.Red);
}
}
}
private static int[] Ports = new int[]
{
1,
2,
3,
80,
};
}
}
扫描指定IP上的端口很长时间很长时间。如何加快进程?
如何在一行中指定端口?(这样输入很愚蠢,用逗号分隔)
如果很简单,那么答案是:使用异步,不要等待另一个检查完成!
您需要在代码中做几件事:
Main从void到async Task。Task检查一个端口的任务 ( )。PortScan扔掉所有多余的东西(循环,清除控制台)void为async Task。.Connect()为.ConnectAsync(),添加await。TcpClient把自己包裹起来using,因为它必须被关闭!Task.WhenAll().结果,会出现这样的情况:
现在您的端口检查将异步进行,即无需等待前一次检查完成。
但是,你有很多可以改进的地方,让我们来做吧:
UserInput()- 为什么此方法不返回结果,而是将其写入某个静态变量?毕竟,它的任务是询问用户并给我们他的工作答案。让我们用不同的方式写它:现在该方法为我们提供了用户输入的内容。
显示彩色消息- 在这里您还应该使用一种方便的方法,例如:
现在您可以方便地显示文本,例如端口的状态。
IP - 学习使用正确的类型,而不是一些基本的类型。在 c# 中有一个特殊的 ip 类
IPAddress,使用它!让我们创建一个询问用户 ip 的方法,如果不正确,则要求一个新的,如果输入成功,它将给我们IPAddress:让我们改进扫描方法- 现在任务正在等待超时,这也可以更改:
让我们创建一个单独的方法(客户端上的某种包装器,最好放在单独的类中)尝试建立连接,但也会异步启动某个计时器,如果运行会抛出错误快点:
好吧,检查一个端口本身的任务:
现在,当检查一个端口时,如果它在 500 毫秒内不可用,我们认为它“关闭”。
多重检查- 您不需要使用端口初始化新数组,只需使用
params逗号分隔的所有端口并将其传递给该方法。让我们创建一个新方法,它将获取一个端口列表,并一次检查它们:它被简单地称为
await CheckPortsAsync(ip, 1, 2, 3, 80);我这里没有讲 OOP 和其他特性,只知道在一个类中写不好,把它分解成不同的类,负责一件事。
所有代码:
执行结果:
其实就这些了,我给你指明了方向,剩下的就看你了!
ReadLine()不Console.ReadLine()呢?因为它对我来说更方便)它是在using static System.Console;.lock其他杂乱无章的东西一起玩了。好吧,总的来说,以一种好的方式,最好是Task<bool>在完成所有任务后,显示结果。验证方法不需要输出任何东西,这本质上是违反SOLID的,所以想想吧!如果您需要这个,那么您可以编写类似以下方法的内容:
在这里,其实一切都很简单:
-,这实际上会给我们一个由字符串集合组成的集合。(First: 1, Last: 2)是一个元组(您也可以使用匿名类型 (new {First: 1, Last: 2})。Enumerable.Range(),它将给出指定范围内的数字。我们称之为:
结果: