当我的一个客户端崩溃时,NetworkStream.Write挂起我的服务器应用程序

时间:2013-03-27 13:07:22

标签: c# .net networking tcp networkstream

我有一个clien-server .net应用程序,那些通过tcp进行通信。我的服务器定期向客户端发送原始字节数据包。

99.9%的情况下,它很有效,但有时,当我的一个客户崩溃(一年两次,而不是更多)时,我的服务器会挂起。

我调试了它(通过向我的客户端添加一些崩溃我的应用程序的测试代码),并注意到问题在stream.Write(bytes, 0, bytes.Length);。它简单没有做任何事情,没有回应,没有回报,只是挂起。 Stream是一个NetworkStream。

我之前检查stream.CanWrite,但它的回答是真的。

那么,我如何检查服务器端,我的一个客户崩溃了?在将数据发送到其他客户端之前,我应该检查NetworkStream(或其他什么)?

2 个答案:

答案 0 :(得分:3)

将超时设置为TCP连接的套接字。看起来现在它是无限的,所以服务器无限期地等待死客户的响应。

答案 1 :(得分:0)

写入可能只是因为另一方没有从套接字读取并且它们的OS套接字缓冲区已满(但它们没有关闭套接字也没有处于错误状态)。

以下是此类情景的说明: http://stringarray.net/?p=29