即使网络出现故障,NetworkStream.Read仍然会阻塞

时间:2012-09-04 07:41:41

标签: c# sockets client-server

我有一个服务器和多个客户端通过TCP套接字连接。服务器侦听连接客户端,这些客户端首先使用其唯一的设备ID注册自己。当设备首次注册时,服务器然后用小消息“刺激”客户端。这会唤醒客户端从其他来源下载数据。

我们遇到的问题是网络通过GPRS而且通常在覆盖不良的地区网络瘫痪或服务质量差。似乎正在发生的事情是,在客户端内部,即使网络层丢失,NetworkStream.Read()调用也会阻塞。没有异常抛出,即使网络返回,呼叫似乎也没有检测到任何数据。

这有什么理由吗?我如何解决这个问题?

我原以为NetworkStream至少会抛出一个异常,所以客户端可以进入重试连接阶段。

2 个答案:

答案 0 :(得分:0)

NetworkStream不会检测一个客户端与另一个客户端之间的连接。它只是监听数据。 Read()会阻塞线程,直到收到数据为止。

相反,请考虑在.Net 4.5中使用BeginRead(或ReadAsync)。它不会阻塞线程,并且在没有新数据的超时之后,您可以关闭套接字,创建一个新套接字并重新开始。

答案 1 :(得分:0)

您需要的是读取超时。在某些情况下,即使对等体未运行,TCP读取也可能永远阻塞。