C# 将零字节写入网络流是检测关闭连接的可靠方法吗?
我正在开发一个应用程序,其中客户端与TCP连接,然后触发大量可能需要花费大量时间才能完成的工作。如果用户断开TCP连接,则必须取消此工作 目前,我正在做的是启动一个计时器,通过执行以下操作定期检查网络流连接:C# 将零字节写入网络流是检测关闭连接的可靠方法吗?,c#,stream,network-programming,C#,Stream,Network Programming,我正在开发一个应用程序,其中客户端与TCP连接,然后触发大量可能需要花费大量时间才能完成的工作。如果用户断开TCP连接,则必须取消此工作 目前,我正在做的是启动一个计时器,通过执行以下操作定期检查网络流连接: // stream is a Stream instance var abort = false; using (new Timer(x => { try { stream.Write(new byte[0], 0, 0); } catch (Ex
// stream is a Stream instance
var abort = false;
using (new Timer(x => {
try
{
stream.Write(new byte[0], 0, 0);
}
catch (Exception)
{
abort = true;
}
}, null, 1000, 1000))
{
// Do expensive work here and check abort periodically
}
我本想阅读
CanWrite
、CanRead
或Connected
,但它们会报告流的最后状态。写入零字节是测试连接性的可靠方法,还是这本身会导致问题?我无法在流中写入或读取任何真实数据,因为这会使客户端陷入混乱。几十年前,我就知道它可以工作,但没有内在的原因说明它应该工作。您和TCP堆栈之间的任何API层都有权禁止向下调用下一层,即使它一直进入堆栈,也只会在以下情况下返回错误:
如果你希望它神奇地探测到网络的另一端,它肯定不会。这似乎对我有用,但我明白你的意思。我不指望它会一直探测,但如果它能稍微探测一点,可能就足够了。某个地方一定有某种本机标志,表示是否存在重置连接?一个事件或其他事情会非常好。@Dervall堆栈知道是否有重置,但我一生中从未见过一个TCP API可以将它提供给您。您必须在TCP连接上执行I/O才能获得错误。它确实是这样设计的:“没有拨号音”。为避免中间节点故障和重新路由而构建。