我使用TcpClient.ReceiveTimeout
属性为TcpClient设置超时。当TcpClient.Read()
方法抛出异常(“连接方在一段时间后没有正确响应”) - 自然地 - 在TcpClient.ReceiveTimeout
毫秒之后,TcpClient.Connected
开始返回false。
这是正常的吗?有办法防止这种情况吗?我想获得异常,但保持连接打开。
答案 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
}
}