如何使用 NetworkStream.DataAvailable 属性 检测 TCP 连接失败?
How to detect TCP connection failure using NetworkStream.DataAvailable property?
当对TCP使用Socket
时,在连接丢失时尝试读取数据会抛出异常。
我习惯于使用异常来了解 TCP 操作何时失败,因为除非尝试 read/write,否则无法可靠地判断连接已断开。
但我只是注意到 NetworkStream.DataAvailable
在这种情况下只是 returns false
,并且 TcpClient.GetStream
也 returns 成功了。我有如下代码(在轮询循环中使用)- 有没有办法扩展这种检测失败连接的方法?
public int Read()
{
var stream = tcp.GetStream();
if (!stream.DataAvailable)
return 0;
else
return stream.Read(InBuffer, 0, InBuffer.Length);
}
如果不是,那么我将不得不使用超时调用 Read
方法之一——这让我想知道 DataAvailable
的意义何在,因为它很容易导致连接失败的错误未检测到。
没有
看,当连接断开时你得到一个异常。
DataAvailable 可能暂时没有可用数据。数据包需要时间来传输,并且数据包可能会丢失。 TCP 具有重发列表数据包的机制,但它会导致延迟。
GetStream returns 流。这是你的终点。它 returns 它在连接可用时发送,这是有道理的。 DataAvailable 用于检查是否有数据等待。数据不等待不是连接丢失 - 它是数据不等待。
当对TCP使用Socket
时,在连接丢失时尝试读取数据会抛出异常。
我习惯于使用异常来了解 TCP 操作何时失败,因为除非尝试 read/write,否则无法可靠地判断连接已断开。
但我只是注意到 NetworkStream.DataAvailable
在这种情况下只是 returns false
,并且 TcpClient.GetStream
也 returns 成功了。我有如下代码(在轮询循环中使用)- 有没有办法扩展这种检测失败连接的方法?
public int Read()
{
var stream = tcp.GetStream();
if (!stream.DataAvailable)
return 0;
else
return stream.Read(InBuffer, 0, InBuffer.Length);
}
如果不是,那么我将不得不使用超时调用 Read
方法之一——这让我想知道 DataAvailable
的意义何在,因为它很容易导致连接失败的错误未检测到。
没有
看,当连接断开时你得到一个异常。
DataAvailable 可能暂时没有可用数据。数据包需要时间来传输,并且数据包可能会丢失。 TCP 具有重发列表数据包的机制,但它会导致延迟。
GetStream returns 流。这是你的终点。它 returns 它在连接可用时发送,这是有道理的。 DataAvailable 用于检查是否有数据等待。数据不等待不是连接丢失 - 它是数据不等待。