0

我得到以下代码:

TcpClient client = new TcpClient("server", 5555);

服务器立即发回一个 ICMP 端口不可达,但程序需要大约 30 秒才能超时并出现 10054 错误。

我关闭了防火墙,wireshark 也在捕获数据包,所以这不是 windows 配置问题。

如何让 TcpClient 识别端口无法访问的数据包?

4

1 回答 1

0

打开的端口立即返回 ICMP 数据包,该数据包由 TcpClient 立即处理,但是对于关闭/阻塞的端口“端口不可达”响应,TcpClient 必须等待 30 秒超时。您可以通过进行异步调用来更改超时方法,如下所示:

TcpClient client = new TcpClient();
client.BeginConnect("server", 5555, 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
    {
        // Do Something
    });
 }
 else
 {
    this.Invoke((MethodInvoker)delegate
    {
        // Do Something
    });
 } 
}
于 2012-06-24T01:24:24.773 回答