2014-09-11 1 views
0

적은 수의 클라이언트에 연결하여 Node.js net 소켓 서버를 올바르게 실행 중입니다. 200 개의 클라이언트 연결 수를 늘리면 모든 초기 연결이 설정되고 올바르게 통신하지만 Ctrl-C를 눌러 클라이언트 프로그램을 닫으면 서버에서 일부만 끊어집니다 (오류 : ECONNRESET 메시지 읽기).).Node.js 클라이언트가 일부 클라이언트 연결을 끊지 못함

이벤트를 듣고 있습니다 : 닫기, 시간 초과, 연결 끊기, 오류 및 종료 데이터 이벤트가 길이 0 데이터를 수신하는지 확인하지만이 상황은 발생하지 않습니다.

동시에 많은 연결이 끊어지면 오류/연결 끊김 이벤트가 발생하지 않는 것처럼 보입니다.

서버와 클라이언트는 실행 중에 예외 나 오류를받지 않습니다. 둘 다 Node.js입니다. -i 여전히 서버

(lsof를 행 서버 개방 접속의 예)

설립 많은 연결을 표시함으로써 두가지

NETSTAT -i 모든 연결 클라이언트

에 종료되는 것을 나타낸다

노드 5,569 루트 18U의 IPv4 4,236,971 0t0 TCP의 xxx.xxx.xxx.xxx:2048->xxxxxx.hsd1.ca.comcast.net:12501 (설립)

는 일에 걸쳐 다른 사람 실행을 가지고 뭐야?

답변

0

클라이언트와 서버가 주기적으로 보내는 일종의 특수 ping/keepalive 메시지를 통합하여 양쪽 끝의 불량 소켓을보다 정확하게/신속하게 확인하는 것이 좋습니다.

+0

이것은 내가 클라이언트의 수천 명의 큐레이터가있을 것이므로 이상적으로 소켓 트래픽을 최대한 줄이고 싶다고 생각한 것입니다. 나는 이와 같은 것을 넣을 것이지만 근본적인 문제를 실제로 해결하지는 않는다고 느낍니다. 흥미롭게도 Node.js [기본적으로 지원] (http://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay)이 문제를 이미 알고 있었기 때문에 그것이 궁금하다. –

+0

'setKeepAlive()'가 있지만 [예상했던대로하지 않을 수도 있습니다] (http://stackoverflow.com/questions/18614176/why-nodejs-keepalive-does-not-seem-to-work) - 예상대로). IMHO 응용 프로그램 수준의 Keepalive 메시지는 제어 권한이 있기 때문에 더 좋습니다. 너무 자주 보내지 않는 한 keepalive 트래픽에 대해 걱정하지 않을 것입니다. – mscdex

+0

예를 들어 [TCP가 작동하는 방법]에 대한 자세한 내용은 http://www.pcvr.nl/tcpip/tcp_conn.htm에서 확인할 수 있습니다. 클라이언트는 Keepalive가 없으면 서버가 소켓을 처리하기 위해 FIN 패킷을 보내야합니다/소켓의 타임 아웃. TCP 소켓 아래에서 UDP와 같은 것을 고려해보십시오. 응용 프로그램 수준의 Keepalive가이 작업을 수행하는 유일한 일관된 방법 인 것처럼 보입니다. –

0

ECONNRESET은 소켓에서 데이터를 쓰거나 읽는 중에 연결이 닫힐 때만 트리거되는 것처럼 보입니다. 트래픽이 없을 때 소켓이 닫히고 클라이언트가 서버에 FIN 패킷을 보내지 않으면 (클라이언트가 연결을 끊었거나 갑작스럽게 연결을 닫음) 소켓에 시간 초과/연결 유지가없는 경우 다른 측은 소켓에 다시 무언가를 보내려고 시도 할 때까지 연결이 종료되었음을 결코 알지 못하고 연결이 끊어짐을 알게됩니다.

+0

그래,'timeout'은 120 초로 고정되어 있습니다. 그러나'FIN '을 보내려면'response.end'를 할 수 있습니다. Plus : http://stackoverflow.com/questions/21953784/how-to-send-the-fin-with-node-js. 인사말!! – loveNoHate

+0

Node.js의 소켓에는 기본적으로 타임 아웃이 없다고 생각합니다 : http://nodejs.org/api/net.html#net_socket_settimeout_timeout_callback –