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

Der*_*all 7 c# network-programming stream

我正在开发一个应用程序,其中客户端连接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
}
Run Code Online (Sandbox Code Playgroud)

我本来想阅读CanWrite,CanRead或者Connected他们报告流的最后状态.写零字节是测​​试连接的可靠方法,还是这本身会导致问题?我无法在流上写或读任何真实数据,因为这会弄乱客户端.

use*_*421 3

这么说吧,几十年前我就知道它是有效的,但没有任何内在原因说明它应该有效。您和 TCP 堆栈之间的任何 API 层都有权抑制对下一层的调用,即使它一直进入堆栈,它也只会在以下情况下返回错误:

  1. 它在检查零长度之前检查网络错误,这取决于实现,并且
  2. 已经存在由先前的某些操作或传入的 RST 引起的网络错误。

如果您期望它能够神奇地一直探测网络到另一端,那么它肯定不会。