C# 将零字节写入网络流是检测关闭连接的可靠方法吗?

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

我正在开发一个应用程序,其中客户端与TCP连接,然后触发大量可能需要花费大量时间才能完成的工作。如果用户断开TCP连接,则必须取消此工作

目前,我正在做的是启动一个计时器,通过执行以下操作定期检查网络流连接:

// 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层都有权禁止向下调用下一层,即使它一直进入堆栈,也只会在以下情况下返回错误:

  • 它在检查零长度之前检查网络错误,零长度取决于实现,并且
  • 由于以前的某些操作或传入的RST,已经存在网络错误

  • 如果你希望它神奇地探测到网络的另一端,它肯定不会。

    这似乎对我有用,但我明白你的意思。我不指望它会一直探测,但如果它能稍微探测一点,可能就足够了。某个地方一定有某种本机标志,表示是否存在重置连接?一个事件或其他事情会非常好。@Dervall堆栈知道是否有重置,但我一生中从未见过一个TCP API可以将它提供给您。您必须在TCP连接上执行I/O才能获得错误。它确实是这样设计的:“没有拨号音”。为避免中间节点故障和重新路由而构建。