我正在使用TcpClient.ReceiveTimeout
属性为TcpClient设置超时。当TcpClient.Read()
方法在TcpClient.ReceiveTimeout
毫秒后抛出异常("连接方在一段时间后没有正确响应")时,TcpClient.Connected
开始返回false。
这正常吗?有办法防止这种情况发生吗?我想获得异常,但保持连接打开。
这是正常行为。
您可以设置无限接收超时来避免这种情况(无限是默认值。您可以使用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
}
}