我有一个clien-server .net应用程序,那些通过tcp进行通信。我的服务器定期向客户端发送原始字节数据包。
99.9%的情况下,它很有效,但有时,当我的一个客户崩溃(一年两次,而不是更多)时,我的服务器会挂起。
我调试了它(通过向我的客户端添加一些崩溃我的应用程序的测试代码),并注意到问题在stream.Write(bytes, 0, bytes.Length);
。它简单没有做任何事情,没有回应,没有回报,只是挂起。 Stream是一个NetworkStream。
我之前检查stream.CanWrite
,但它的回答是真的。
那么,我如何检查服务器端,我的一个客户崩溃了?在将数据发送到其他客户端之前,我应该检查NetworkStream(或其他什么)?
答案 0 :(得分:3)
将超时设置为TCP连接的套接字。看起来现在它是无限的,所以服务器无限期地等待死客户的响应。
答案 1 :(得分:0)
写入可能只是因为另一方没有从套接字读取并且它们的OS套接字缓冲区已满(但它们没有关闭套接字也没有处于错误状态)。
以下是此类情景的说明: http://stringarray.net/?p=29