8

我正在开发一个应用程序,其中客户端连接 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但他们报告了流的最后状态。写入零字节是测​​试连接性的可靠方法,还是这本身会导致问题?我无法在流上写入或读取任何真实数据,因为这会弄乱客户端。

4

1 回答 1

3

假设我在几十年前就知道它可以工作,但没有内在的理由为什么应该这样做。您和 TCP 堆栈之间的任何 API 层都有权禁止对下一层的调用,即使它一直进入堆栈,它也只会在以下情况下返回错误:

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

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

于 2012-08-01T09:14:56.207 回答