2

我们有一个连接到外部计费服务器的应用程序。一旦客户端的服务器出现中断,就会有数百个连接处于 CLOSE_WAIT 状态。

我已经检查了客户端代码。似乎客户端正在正确关闭 TCP 连接。

如果发生这种情况是因为服务器由于服务器端的问题而没有正确关闭连接,有没有办法阻止客户端表单将套接字保持在 CLOSE_WAIT 状态?

我还观察到线程数和 cpu 使用率比平时增加了更多。

应用程序重新启动后,即使几个小时后也没有建立 CLOSE_WAIT,并且线程数和 cpu 使用率恢复正常。

如果 sever 有时无法正确关闭连接,除了重新启动客户端以删除 CLOSE_WAITs 之外,我们没有什么可做的吗?(我的意思是有任何代码改进可以防止客户端出现这个问题)

我们在客户端使用定制的 JDiameter 代码连接到计费服务器。

(我们无权访问服务器端代码)

4

1 回答 1

2

如果发生这种情况是因为服务器由于服务器端的问题而没有正确关闭连接...

它没有。

RFC 793规定:“CLOSE_WAIT - 表示等待来自本地用户的连接终止请求。” 这意味着对端已经关闭了连接:TCP 收到了一个 FIN,它正在等待本地应用程序也这样做。

如果您在自己的连接端遇到此问题,则表明一件事:您没有关闭自己的套接字。您忽略了套接字上的 EOS 条件或异常,并继续使用它。

解决方案:不要。EOS 意味着您必须停止读取并关闭套接字。任何IOException其他的SocketTimeoutException意思都是一样的。

于 2013-06-13T11:31:26.180 回答