超时后TcpClient连接中断

时间:2012-12-17 17:29:18

标签: c# .net sockets timeout tcpclient

我使用TcpClient.ReceiveTimeout属性为TcpClient设置超时。当TcpClient.Read()方法抛出异常(“连接方在一段时间后没有正确响应”) - 自然地 - 在TcpClient.ReceiveTimeout毫秒之后,TcpClient.Connected开始返回false。

这是正常的吗?有办法防止这种情况吗?我想获得异常,但保持连接打开。

1 个答案:

答案 0 :(得分:1)

这是正常行为。

您可以设置无限接收超时以避免这种情况(无限是默认值。您可以使用0显式设置它作为ReceiveTimeout属性)。但是,如果在另一端真的没有客户端,那么会导致程序响应性出现问题。记录连接失败然后创建新连接可能会更好,具体取决于您的确切用例。

这是我通常使用的模式(伪代码。连接方法通常与异常处理内联):

while (!done)
{
    // Try to connect with a reasonable ReceiveTimeout
    connected = EstablishTheConnectionAndHandleAnyException();
    if (connected)
    {
        // Do useful work
        done = true;
    }
    else
    {
        // Receive timeout
        // If interactive, give the user an opportunity to abort
        //    by setting done = true
        // At least log the situation
    }
}