NetworkStream.BeginReading 当客户端连接断开时

本文关键字:断开 连接 客户端 BeginReading NetworkStream | 更新日期: 2023-09-27 17:56:16

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

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

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

我是否必须轮询基础套接字,如此 SO 问题所示?

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

NetworkStream.BeginReading 当客户端连接断开时

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

这使我能够在由于流上没有数据而拉动超时时引发事件。