【问题标题】:TcpClient timeout ICMP port unreachableTcpClient 超时 ICMP 端口不可达
【发布时间】:2012-06-23 16:31:00
【问题描述】:

我得到以下代码:

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

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

我关闭了防火墙,wireshark 也在抓包,所以不是 windows 配置问题。

如何让 TcpClient 识别端口不可达的数据包?

【问题讨论】:

    标签: c# timeout tcpclient icmp


    【解决方案1】:

    打开的端口立即返回 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
        });
     } 
    }
    

    【讨论】:

    • 不会在同样的 30 秒超时后调用 CallBack 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多