Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NetworkStream.Read即使在网络关闭时仍会阻塞_C#_Sockets_Client Server - Fatal编程技术网

C# NetworkStream.Read即使在网络关闭时仍会阻塞

C# NetworkStream.Read即使在网络关闭时仍会阻塞,c#,sockets,client-server,C#,Sockets,Client Server,我有一个服务器和多个通过TCP套接字连接的客户端。服务器侦听连接的客户端,这些客户端首先使用其唯一的设备id注册自己。当设备首次注册时,服务器会用一条小消息“提示”客户端。这会唤醒客户端从另一个源下载数据 我们面临的问题是,网络是通过GPRS传输的,而且在覆盖率较低的地区,网络经常出现故障或服务质量较差。似乎正在发生的是,在客户端内部,NetworkStream.Read()调用被阻塞,即使网络层断开。没有抛出异常,甚至当网络返回时,调用似乎也没有检测到任何数据 这有什么原因吗?我如何回避这个问

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

我们面临的问题是,网络是通过GPRS传输的,而且在覆盖率较低的地区,网络经常出现故障或服务质量较差。似乎正在发生的是,在客户端内部,NetworkStream.Read()调用被阻塞,即使网络层断开。没有抛出异常,甚至当网络返回时,调用似乎也没有检测到任何数据

这有什么原因吗?我如何回避这个问题


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

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


取而代之,考虑使用(或.NET 4.5)。它不会阻塞线程,在没有新数据的超时后,您可以关闭套接字,创建一个新的套接字,然后重新启动

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

TCP需要轮询。它没有类似的事件。我实现了一种机制,检查服务器/客户端是否通过
netstat
连接。你可以读到它。我希望这对你有帮助。