1

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

它在 99.9% 的情况下都很好用,但有时,当我的一个客户端崩溃(一年两次,不多)时,我的服务器会挂起。

我对其进行了调试(通过向我的客户端添加一些导致我的应用程序崩溃的测试代码),并注意到问题在stream.Write(bytes, 0, bytes.Length);. 它简单不做任何事情,不响应,不返回,只是挂起。流是一个网络流。

我之前检查stream.CanWrite过,但它的反应是真的。

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

4

2 回答 2

3

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

于 2013-03-27T13:22:57.097 回答
1

写入可能会挂起,因为对方没有从套接字读取并且他们的操作系统套接字缓冲区已满(但他们没有关闭套接字,也没有处于错误状态)。

这是对这种情况的描述: http ://stringarray.net/?p=29

于 2013-04-06T15:58:11.367 回答