【发布时间】:2012-01-27 02:44:09
【问题描述】:
我正在尝试使用异步扫描一次扫描多个端口。问题是我只能显示第一个工作端口,然后等待我的应用程序关闭 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;
});
}
}
【问题讨论】:
-
你说你的应用程序正在关闭是什么意思?另外,你到底得到了什么输出?
-
@Scott Smith,是的,只是关闭没有错误,没有警告。输出是
open,因为我知道我开始使用的端口(80)是打开的。 -
您需要使用 try catch 将代码包装在 CallBack 函数中并处理 SocketExceptions。由于端口未打开,后续连接很可能被拒绝。这发生在 EndConnect 调用中。
-
@Scott Smith,这修复了意外关闭,但我仍然无法仅检查第一个端口。
-
您的代码正在检查所有端口。我自己对此进行了测试,并且端点没有在除 80 之外的其他端口上侦听,因此连接被拒绝。
标签: c# winforms tcpclient asynccallback