我正在尝试使用异步扫描一次扫描多个端口。问题是我只能显示第一个工作端口,然后等待我的应用程序关闭20秒,并告诉我端口已关闭。
这段代码有什么问题?
private void btnStart_Click(object sender, EventArgs e)
{
for (int port = 80; port < 100; port++)
{
ScanPort(port);
}
}
private void ScanPort(int port)
{
var client = new TcpClient();
try
{
client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
}
catch (SocketException)
{
client.Close();
}
}
private void CallBack(IAsyncResult result)
{
var client = (TcpClient)result.AsyncState;
client.EndConnect(result);
if (client.Connected)
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open2" + Environment.NewLine;
});
}
else
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed2" + Environment.NewLine;
});
}
}
答案 0 :(得分:1)
在你的回调方法中,我会确保关闭连接并处理TcpClient。此外,TcpClient.EndConnect(IAsyncResult)也可以抛出异常。我也没有看到捕获端口号的位置以便显示给用户。我会写回调这样的回调。
编辑:我实际上并没有编译或执行我的代码(对不起)。我还发现了另一篇文章,展示了如何在C#中创建端口扫描程序,http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/这篇文章中有评论说明,
这里有一个问题:TCPClient.Close()函数的.NET实现实际上并没有正确关闭连接。因此,在调用TCPClient.Close之前,我们还需要执行额外的步骤来获取表示连接的流并关闭它。
private void CallBack(IAsyncResult result)
{
var client = (TcpClient)result.AsyncState;
bool connected = false;
try
{
client.EndConnect(result);
connected = client.Connected;
}
catch (SocketException)
{
}
catch (ObjectDisposedException)
{
}
finally
{
if (client.Connected)
{
client.Close();
}
client.Dispose();
}
if (connected)
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open2" + Environment.NewLine;
});
}
else
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed2" + Environment.NewLine;
});
}
}