如何杀死“CLOSE_WAIT”和“FIN_WAIT2”网络连接

时间:2013-03-25 19:07:03

标签: linux node.js socket.io

我使用node.js和socket.io创建了一个游戏。一切正常,但这个游戏套接字服务器不时响应任何连接。当我转到处理信息时 - >文件和连接(在webmin中),然后我看到有许多与CLOSE_WAITFIN_WAIT2状态的连接。我认为问题在于这些连接,因为当有大约1,000个连接时游戏失败。服务器操作系统是Ubuntu Linux 12.04。

如何终止这些连接或增加允许的最大连接数?

3 个答案:

答案 0 :(得分:1)

要添加到Jim的答案,我认为您的客户端处理关闭套接字连接时存在问题。看来你的客户端没有正确关闭套接字(服务器启动和客户端启动关闭),这就是你的服务器有这么多等待状态的原因

答案 1 :(得分:0)

Linux有SO_REUSEADDR选项用于设置套接字参数。它允许立即重用相同的端口。知道您的工具集的人可以告诉您如何设置套接字选项。你可能已经知道了。我不知道这个工具集。

从旧的java docset: http://docs.oracle.com/javase/1.5.0/docs/guide/net/socketOpt.html

答案 2 :(得分:0)

您无需终止连接或增加允许的数量。您需要在连接的一侧修复应用程序中的缺陷,特别是未启动关闭的一侧。

参见RFC 793的图13。您的程序位于关闭序列的第3步。您在FIN-WAIT-2中看到的一侧表现正常。它已启动关闭,TCP堆栈已在网络上发送FIN数据包。 CLOSE-WAIT中的一方存在缺陷。该方的TCP堆栈已收到并确认了FIN数据包,但该应用程序未能注意到。应用程序如何检测远程端已关闭连接将取决于您的平台。不幸的是,我老了,不知道node.js或socket.io。

C中发生的情况是套接字看起来是可读的,但read()返回一个零长度的数据包。当应用程序看到这个时,它应该调用close()。您将在node.js或socket.io的文档中找到相同的东西。

当你找到它时,考虑在这里回答你自己的问题并接受答案。