Node.js网络服务器没有收到一些客户端断开连接

问题描述:

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

我正在监听事件:关闭,超时,断开连接,错误并结束 我还检查数据事件是否接收到长度为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(建立)

具有跨越日比谁跑是什么?

您应该考虑引入某种特殊的ping/keepalive消息,客户端和服务器定期发送这些消息以更准确地/快速检查两端的死链路。

+0

这是我已经考虑的事情,尽管理想情况下我希望尽可能地降低套接字流量,因为那里会有成千上万个客户端的Keepalive。我会把这样的东西放进去,但感觉就是它没有真正解决根本问题。有趣的是,Node.js [原生支持](http://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay)我不知道是否因为他们已经知道这个问题。 – 2014-09-11 15:54:35

+0

有'setKeepAlive()',但[它可能不会做你期望它做的事情](http://*.com/questions/18614176/why-nodejs-keepalive-does-not-seem-to-work -as预期)。恕我直言,应用程序级别的Keepalive消息更好,因为您可以更好地控制它。只要你不太频繁地发送它们,我就不会担心keepalive流量。 – mscdex 2014-09-11 16:08:32

+0

Yea阅读更多关于[TCP如何在内部工作](http://www.pcvr.nl/tcpip/tcp_conn.htm)客户端必须发送一个FIN数据包供服务器处理套接字,除非存在Keepalive /套接字上的超时。这是合理的,考虑在TCP套接字下面就像UDP一样。它看起来像一个应用程序级别的Keepalive是唯一一致的方法来做到这一点。 – 2014-09-11 16:55:04

看来ECONNRESET只有在连接关闭时触发,同时在套接字上写入/读取数据。如果套接字在没有流量时关闭,并且客户端不向服务器发送FIN数据包(如客户端崩溃或突然关闭连接),并且套接字上没有超时/保持活动,则另一个方不知道连接已经终止,直到它试图再次在套接字上发送一些东西,并意识到连接中断。

+0

是的,'超时'固定在120秒。但是你可以做一个'response.end'来发送'FIN'。 Plus:http://*.com/questions/21953784/how-to-send-the-fin-with-node-js。问候!! – loveNoHate 2014-09-11 17:27:51

+0

我相信Node.js中的套接字默认没有超时: http://nodejs.org/api/net.html#net_socket_settimeout_timeout_callback – 2014-09-11 17:42:08