2013-03-25 2 views
3

node.js 및 socket.io를 사용하여 게임을 만들었습니다. 모든 것이 잘 작동하지만 때때로이 게임 소켓 서버는 어떤 연결에도 응답하지 않습니다. 프로세스 정보 -> 파일 및 연결 (webmin에 있음)으로 이동하면 CLOSE_WAITFIN_WAIT2 상태와의 연결이 많이 있음을 알 수 있습니다. 약 1,000 개의 연결이있을 때 게임이 실패하기 때문에이 연결에 문제가 있다고 생각합니다. 서버 OS는 Ubuntu Linux 12.04입니다."CLOSE_WAIT"및 "FIN_WAIT2"네트워크 연결을 끊는 방법

어떻게 이러한 연결을 끊거나 최대 허용 연결을 늘릴 수 있습니까?

+0

1 시간 동안 응용 프로그램을 실행하고 8 개의 "FIN_WAIT2"연결과 동일한 IP 주소의 모든 응용 프로그램을 실행합니다. 약 50 명의 플레이어가 게임을했지만, 단 한 명의 플레이어 만 게임을 즐길 수 있습니다. 어쩌면 누군가가 그런 문제를 겪었을 것입니까? 어쩌면 내가 socket.io 설정 (서버 및 클라이언트 쪽, 내가 기본 설정을 사용하는이 시점에서)을 변경해야합니까? –

답변

0

리눅스에는 소켓 매개 변수 설정을위한 SO_REUSEADDR 옵션이 있습니다. 동일한 포트를 즉시 재사용 할 수 있습니다. 당신의 툴셋을 아는 사람은 소켓 옵션을 설정하는 방법을 알려줄 수 있습니다. 당신은 이미 방법을 알고있을 것입니다. 나는이 툴셋을 모른다. 오래된 자바 문서 세트에서

: http://docs.oracle.com/javase/1.5.0/docs/guide/net/socketOpt.html

+0

Jim 응답에 추가하려면 소켓 연결을 닫는 클라이언트 처리 문제가 있다고 생각합니다. 클라이언트가 소켓을 제대로 닫지 않은 것 같습니다 (서버 시작 및 클라이언트 시작이 모두 닫혔습니다). 서버에 너무 많은 대기 상태가 있습니다. – Pradheep

+0

누락 된 SO_REUSEADDR은 바인딩 실패로 나타납니다. OP가 이것보다 더있어. – fizzer

1

짐의 대답에 추가하려면, 내가 소켓 연결의 폐쇄 클라이언트 처리에 문제가있다 생각합니다. 클라이언트가 소켓을 제대로 닫지 않은 것 같습니다 (서버 시작 및 클라이언트 시작이 모두 닫혔습니다). 서버가 너무 많은 대기 상태를 가지고있는 이유가 여기에 있습니다.

+1

이것은 답변이 아닙니다. –

+0

을 참조하는 대답에 대한 주석이어야합니다. 문제는 응용 프로그램에 있으며 문제가 해결되지 않으면 해결되지 않습니다. 이것은 우리가 근본 원인을 지적 할 때 유효한 답변입니다. – Pradheep

0

연결을 끊거나 허용 된 수를 늘릴 필요가 없습니다. 연결의 한 쪽에서 응용 프로그램의 결함, 특히 닫기를 시작하지 않는 쪽의 결함을 수정해야합니다.

RFC 793의 그림 13을 참조하십시오. 귀하의 프로그램은 가까운 순서의 3 단계에 있습니다. FIN-WAIT-2에서 보는면이 올바르게 작동합니다. 그것은 닫기를 시작했으며 TCP 스택은 네트워크에서 FIN 패킷을 보냈습니다. CLOSE-WAIT의 측면에는 결함이 있습니다. 그 쪽의 TCP 스택이 FIN 패킷을 수신하고 확인했지만 응용 프로그램이 통지에 실패했습니다. 응용 프로그램이 원격 측에서 연결을 닫았 음을 감지하는 방법은 플랫폼에 따라 다릅니다. 불행히도, 나는 노인이며 node.js 또는 socket.io를 모른다.

C에서는 소켓이 읽을 수 있지만 Read()는 길이가 0 인 패킷을 반환합니다. 응용 프로그램이이를 볼 때 close()를 호출해야합니다. node.js 또는 socket.io의 문서에서 상응하는 것을 찾을 수 있습니다.

여기에서 자신의 질문에 대답하고 답변을 수락하는 것을 고려해보십시오.

관련 문제