0

我有一个 TCP 客户端流,正在通过异步调用 NetworkStream.BeginRead 读取(传递异步回调委托)。问题是检测连接何时断开。目前,如果连接被切断,BeginRead 调用就会消失在以太中 - 只是不会调用回调。如果应用程序在其关闭时尝试在流上发送,这确实会触发回调并且 NetworkStream.EndRead 会引发异常 - 这没关系 - 但如果没有发出发送,则应用程序只是处于黑暗中,不知道连接已关闭。

最初我看到 NetworkStream.ReadTimout 没有设置(即默认的 Timout.Infinite)——但是设置这个(比如 3000 毫秒)并没有帮助。[编辑:MSDN 文档明确指出,ReadTimeout 仅适用于同步读取调用而不是 asyn BeginRead - 我应该更早地检查一下:-(]

如何检测客户端连接失败?

我是否必须像这个 SO question中所示那样轮询底层套接字?

另外:当物理上重新建立连接时,回调仍然不会被调用——我们只是在以太中等待,直到我们尝试发送。

4

1 回答 1

0

我最终不得不从 TcpClient 异步更改为同步BeginReadRead并在专用读取 Thead 上超时。

这使我能够在由于流中没有数据而导致超时被拉时引发事件。

于 2012-04-11T14:08:37.127 回答