客户端连接断开时的NetworkStream.BeginRead

时间:2011-05-13 13:58:23

标签: c# sockets tcp tcpclient networkstream

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

最初我看到没有设置NetworkStream.ReadTimout(即默认为Timout.Infinite) - 但设置此值(比如说,3000毫秒)并没有帮助。 [编辑:MSDN doc明确指出ReadTimeout仅适用于同步Read调用而不是asyn BeginRead - 我应该在之前更仔细地检查:-(]

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

我是否必须轮询底层套接字,如this SO question

所示

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

1 个答案:

答案 0 :(得分:0)

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

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