我在尝试异步扫描TCP端口。由于开放端口只需几百毫秒就可以完成,但是当端口关闭时,我必须等待响应。如何使扫描TCP端口的过程更快?
所以会发生的是,我运行的应用程序,几乎马上我看到端口80打开。然后我必须等半分钟才能扫描所有其他端口。
编辑。再加上我想显示响应,因为它发生,等待其他端口进行检查。
如何让这更快?
private void btnStart_Click(object sender, EventArgs e)
{
for (int port = 79; port < 90; port++)
{
ScanPort(port);
}
}
private void ScanPort(int port)
{
TcpClient client = new TcpClient();
client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
}
private void CallBack(IAsyncResult result)
{
bool connected = false;
using (TcpClient client = (TcpClient)result.AsyncState)
{
try
{
client.EndConnect(result);
connected = client.Connected;
}
catch (SocketException)
{
}
}
if (connected)
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open2" + Environment.NewLine;
});
}
else
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed2" + Environment.NewLine;
});
}
}
它们几乎同时打开,但是直到达到超时时间,未激活的端口才会被阻止。因此一个开放的端口立即返回“open2”,关闭的端口等到达到timout – Matten
@Matten,我也不明白为什么几乎同时显示封闭的端口。 – NewHelpNeeder
@NewHelpNeeder:他们不是“被关闭”。它们实际上是由防火墙屏蔽的,所以你不会得到“Port Unreachable”的ICMP消息,它会告诉你的软件端口已关闭。所以你得到的唯一迹象是没有回应的超时。由于所有连接的超时时间都是相同的,并且您一次启动所有连接,所以超时全部同时发生。 –