【问题标题】:Node.js net server not receiving some client disconnectsNode.js 网络服务器未收到某些客户端断开连接
【发布时间】:2014-11-04 20:10:46
【问题描述】:

我有一个 Node.js 网络套接字服务器正在运行,它在连接到它的客户端数量很少的情况下运行良好。但是,当我将数量增加到 200 个客户端连接时,所有初始连接都建立并正确通信,但是当我按 Ctrl-C 关闭客户端程序时,服务器上仅收到一些断开连接(通过错误:读取 ECONNRESET 消息)。

我正在监听事件:关闭、超时、断开连接、错误和结束 我也检查了data事件是否接收到长度为0的数据,但是这种情况从来没有触发过。

当同时有很多断开连接时,错误/断开连接事件有时似乎不会触发。

服务器和客户端在运行时没有收到异常或错误;两者都是 Node.js。

netstat -i 显示客户端所有连接都终止

lsof -i 显示服务器上仍然建立了许多连接

(从 lsof 在服务器上保持打开的连接示例)

节点 5569 根 18u IPv4 4236971 0t0 TCP xxx.xxx.xxx.xxx:2048->xxxxxx.hsd1.ca.comcast.net:12501(已建立)

还有其他人遇到过这个吗?

【问题讨论】:

    标签: node.js sockets unix disconnect


    【解决方案1】:

    您应该考虑合并客户端和服务器定期发送的某种特殊 ping/keepalive 消息,以更准确/快速地检查两端的死套接字。

    【讨论】:

    • 这是我考虑过的事情,但理想情况下我希望尽可能减少套接字流量,因为这样就会有来自数千个客户端的保活。我会把这样的东西放进去,但感觉它并没有真正解决根本问题。有趣的是,Node.js supports this natively 不知道是不是因为他们已经知道这个问题了。
    • setKeepAlive(),但有it may not do what you expect it to do。恕我直言,应用程序级保活消息更好,因为您可以更好地控制它。只要你不经常发送它们,我就不会担心keepalive流量。
    • 是的,在how TCP works internally 上阅读更多内容,除非套接字上存在保活/超时,否则客户端必须向服务器发送一个 FIN 数据包以将套接字处理为已关闭。考虑到在 TCP 套接字下它就像 UDP,这是有道理的。看起来应用程序级别的 keepalive 是唯一一致的方法。
    • 谢谢,我会支持你,但我还没有足够的声望。
    【解决方案2】:

    似乎只有在连接关闭且套接字上有数据正在写入/读取时才会触发 ECONNRESET。如果套接字在没有流量时关闭并且客户端没有向服务器发送 FIN 数据包(因为客户端已经崩溃或突然关闭连接)并且套接字上没有超时/保持连接,那么另一个side 永远不知道连接已经终止,直到它再次尝试在套接字上发送某些内容并意识到连接已断开。

    【讨论】:

    猜你喜欢
    • 2018-02-09
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2017-01-07
    • 2015-04-04
    • 2011-09-28
    相关资源
    最近更新 更多