2013-02-11 2 views
0

소켓에 문제가 있습니다. 컴퓨터와 휴대 전화 사이에 소켓을 만들어 메시지를 보내고 있습니다. 서버 또는 클라이언트를 닫을 때 FIN 패킷을 보내고 1 분 동안 FIN_WAIT2 상태로 유지됩니다. 그러나 다른 쪽은 CLOSE_WAIT 상태에 머물러있어 분명히 소켓을 닫을 수 없습니다. 나는 소켓을 즉시 닫아야한다고 생각한다. 그래서 서버가 소켓을 닫고 싶을 때 소켓을 닫는 코드를 구현해야한다. 어떻게해야합니까?소켓 반대쪽 소켓이 닫히지 않는 이유는 무엇입니까? (close_wait)?

답변

2

소켓 채널의 양쪽 끝을 닫아야합니다.

서버가 클라이언트에 대한 연결을 닫으면 클라이언트는 마지막 FIN 패킷 (클라이언트에서 서버로)을 전송하기 위해 클라이언트 쪽에서 연결을 닫아야합니다. 그러면 TCP state machine에서 마지막 상태 전환이 트리거됩니다.

+0

감사합니다.하지만 클라이언트에서 연결을 닫는 코드를 구현하는 방법을 모르겠습니다. 서버를 닫으면 소켓 측면이 자동으로 닫힙니다. 어떤 조건을 테스트하거나 클라이언트 측에서 예외를 잡아서 뭔가 잘못되었을 때 소켓을 닫아야합니까? 이것을 구현하는 방법일까요? – cracq

+2

@cracq 소켓의 원격 끝이 닫히면 로컬 끝이 읽을 수있게되고 이후의 읽기 작업은 길이가 0 인 상태로 반환됩니다. 이것은 소켓이 리모트 끝에서 잘 닫혀 졌음을 의미하며 끝을 닫아야 함을 의미합니다. –

0

CLOSE_WAIT는 피어가 FIN을 보내고 TCP가 로컬 응용 프로그램이 소켓을 닫을 때까지 기다리는 중임을 나타냅니다. RFC 793을 참조하십시오. 자동으로 발생하지는 않습니다.

관련 문제