我使用 node.js 和 socket.io 创建了一个游戏。一切正常,但有时这个游戏套接字服务器不响应任何连接。当我转到进程信息-> 文件和连接(在 webmin 中)时,我看到有很多连接CLOSE_WAIT
和FIN_WAIT2
状态。我认为问题出在这些连接上,因为当有大约 1,000 个连接时游戏会失败。服务器操作系统是 Ubuntu Linux 12.04。
如何终止这些连接或增加允许的最大连接数?
为了补充吉姆的答案,我认为您的客户端处理关闭套接字连接时存在问题。似乎您的客户端没有正确关闭套接字(服务器启动和客户端启动关闭),这就是您的服务器有这么多等待状态的原因
您无需终止连接或增加允许的数量。您需要在连接的一侧修复应用程序中的缺陷,特别是未启动关闭的一侧。
参见RFC 793的图 13 。您的程序处于关闭序列的第 3 步。您在 FIN-WAIT-2 中看到的那一面表现正确。它已启动关闭,并且 TCP 堆栈已在网络上发送了一个 FIN 数据包。CLOSE-WAIT 的一方有缺陷。那边的 TCP 栈已经收到并确认了 FIN 包,但是应用程序没有注意到。应用程序如何检测远程端已关闭连接将取决于您的平台。不幸的是,我老了,不知道 node.js 或 socket.io。
在 C 中发生的情况是套接字看起来是可读的,但是 read() 返回一个长度为零的数据包。当应用程序看到这一点时,它应该调用 close()。您将在 node.js 或 socket.io 的文档中找到等效的内容。
当你找到它时,考虑在这里回答你自己的问题并接受答案。
Linux 有SO_REUSEADDR
设置套接字参数的选项。它允许立即重用同一端口。了解您的工具集的人可以告诉您如何设置套接字选项。你可能已经知道怎么做了。我不知道这个工具集。
从较旧的 java 文档集:http: //docs.oracle.com/javase/1.5.0/docs/guide/net/socketOpt.html