[질문] 소켓에서 연결 끊으면 time out
글쓴이: 익명 사용자 / 작성시간: 금, 2002/07/26 - 6:38오후
서버 프로그래밍을 해서 서버 띄워놓거
클라이언트로 무쟈게 접속을 시도 햇거든여..
포트 포워딩 처럼 걍 들어오면 다른쪽으로 넘겨주는 역할이구여
근데 netstat -an 치면
211.xxx.xxx.xxx.37417 211.xxx.xxx.xxx.xxx.8787 32119 0
8760 0 TIME_WAIT
이런식으로 타임 아웃이 걸립니다.. 쩌비..
그래서 서버데몬을 잠시 강제 종료 하면 .. 잠시동안
저 타임 아웃이 없어질때까지.. 띄우질 못해엽..
소켓 확실히 닫았구여 close(sock)
클라이언트에서도 잘 닫거...
서버에서도 닫거 쓰레드 죽이거..
후훔.. 왜 그런지 아시면 답변좀 부탁합니다.
Forums:
Re: [질문] 소켓에서 연결 끊으면 time out
서버가 종료되어도 일정시간(보통 45초에서 1분이내...) port가 살아 있는
것처럼 되어있습니다.
그 이유는 아래 두 문서를 참고하세요.(아래문서는 본 게시판에서 검색해서
옮겨만 놨습니다.)
원문
http//www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html
축약(설명)한 게시물
http//kldp.org/script/bbs/read.php?table=qa2&no=3685&o[sc]=c&o[ss]=socket&o[st]=a&o[at]=s&o[sct]=s&o[stt]=s
하지만 다시 서버를 띄워도 될 수 있는 옵션이 있습니다.
int optval =1;
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(optval));
이와 같이 사용하면 port의 TIME_WAIT와는 상관없이 다시 그 포트를 사용
할 수 있게 됩니다.
실질적인 사용예는
(Win32프로그램까지 생각해서 만들어진 소스라 약간 지저분해
보일 수도 있습니다. -))
http//home.t-online.de/home/Andreas.Steinmetz/shared/svsock.html
를 참고하시면 됩니다.
답변을 달기위해서 여기저기 찾다보니 예전에 사용했던 방법이더군요.
덕분에 잊어버렸던 기억을 되찾은 기분입니다. ((감사합니다.)) -)
Re: [질문] 소켓에서 연결 끊으면 time out
SO_REUSEADDR 옵션 말고 SO_LINGER 옵션이 있습니다.
SO_REUSEADDR 옵션은 같은 주소를 다시 써도 된다는 소리고
(즉, TIME_WAIT 상태가 유지되도... 그 주소를 이용하겠다는 뜻이고)
SO_LINGER 옵션은 바로 rst 신호를 보내서 TIME_WAIT 상태 없이
접속을 끊어버립니다. 자세한 사용법은 UNIX Network Programming 을
참고하시길... ^^;
그럼 고운 하루...
Re: [질문] 소켓에서 연결 끊으면 time out
REUSEADDR을 써도 좋지만 그것은 매우 않좋은거 같습니다.
일단 기존의 에러상황을 무시하는 뜻이니 바람직하지 않죠.
질문하신분의 경우 상태 해결은 간단합니다.
Accept부분에서 close를 곧바로 하지 않으시면 됩니다.
즉, connect한 클라이언트보다 accept된 서버가 먼저 close를 하는 경우
Timeout이 발생됩니다. 이때 이 포트는 다음 검사때까지
사용하기 어려운 부분으로 표시됩니다.
대부분 이런 경우가 발생하는 것을 예상치 못하는데
연결후 마지막 동작을 클라이언트로부터 서버로 1바이트라도 전송하는
동작을 취하면 accept한 서버는 절대로 읽어야 할 데이터가 있기 때문에
먼저 끊지 못하는 방법이 있습니다.
즉, 프로토콜을 정의하실때 이런점은
항시 고려해야 안전한 서버가 되는것이겠죠..
전송할 데이터가 전혀 필요없고 단순히 연결만을 취한다면
REUSEADDR을 사용하는게 좋고요...
댓글 달기