public static void Main(string[] args) {
try {
string ip;
int 起始端口;
int 结束端口;
int 验证延迟;
Console.Write("输入地址后回车:");
ip = Console.ReadLine().Trim();
Console.Write("输入起始端口后回车:");
起始端口 = int.Parse(Console.ReadLine().Trim());
Console.Write("输入结束端口后回车:");
结束端口 = int.Parse(Console.ReadLine().Trim());
Console.Write("输入验证延迟后回车,单位毫秒(超时则认为不通):");
验证延迟 = int.Parse(Console.ReadLine().Trim());
Console.WriteLine("正在扫描已开放端口:");
List<Task<bool>> list = new List<Task<bool>>();
for (int i = 起始端口; i <= 结束端口; i++) {
list.Add(端口测试(ip, i, 验证延迟));
}
foreach (Task<bool> a in list) {
bool f = a.Result;
}
Console.WriteLine("扫描结束");//只有线程池所有任务执行完才会执行这行代码
Console.ReadLine();
} catch { }
}
public static async Task<bool> 端口测试(string ip, int port, int 验证延迟) {
TcpClient tcpClient = new TcpClient() { SendTimeout = 验证延迟 };
try {
await tcpClient.ConnectAsync(ip, port);
Console.WriteLine(port);
return true;
} catch (Exception ex) {
}
tcpClient.Close();
tcpClient.Dispose();
return false;
}
有时候检测需要的时间有点长,不知道为什么,可能是Task调度问题。不过基本能用