TcpClient超时ICMP端口无法访问

时间:2012-06-23 16:31:01

标签: c# timeout tcpclient icmp

我收到了以下代码:

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

服务器立即发回一个ICMP端口 - 无法访问,但该程序大约需要30秒才会超时10054错误。

我关闭了防火墙,wireshark也在捕获数据包,因此它不是Windows配置问题。

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

1 个答案:

答案 0 :(得分:0)

开放端口立即返回ICMP数据包,该数据包由TcpClient立即处理,但是关闭/阻止端口“Port Unreachable”响应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
    });
 } 
}