localhost:55555 로 바인딩하는데 이미 TIME_WAIT 가 있을 때 랜덤 포트로 바인딩되는 경우가 있나요?
글쓴이: hxploit / 작성시간: 목, 2015/02/05 - 11:07오전
음.. 좀 황당한 경우인데요.
대략 이런식으로
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(55555);
이렇게 127.0.0.1:55555 를 바인딩하고 있습니다.
이 때, 처음 한 번 열때는 당연히 잘 열립니다. 이 상태에서 한 번 클라이언트 연결을 시킨 다음
바로 종료해서 netstat 에 TIME_WAIT 가 잠깐 남아있도록 합니다.
그리고 이 상태에서 다시 서버를 켜서 55555 바인딩을 시도하면, 에러가 나거나 하면 모르겠는데
잘 실행이 되고, netstat 을 확인해보면 황당하게도 0.0.0.0:xxxxx 로 바인딩 되어 있습니다.
포트는 랜덤하고 localhost 가 아니라 INADDR_ANY 가 되어 있습니다.
이게 정상적인 경우가 맞나요?
물론 이 프로그램 내에서는 현재 동시에 바인딩을 2개 하고 있는데, 하나는 localhost:55555 이며
하나는 0.0.0.0:33333 입니다. 물론 33333 은 위에 관계없이 그냥 항상 잘 바인딩 되고 있습니다.
(클라이언트 연결을 33333 으로 하진 않았습니다.)
이런 경우는 처음 봐서 질문해봅니다. 환경은 리눅스이고 CentOS 6.2 쯤 되며 gcc 4.1.2 로 빌드했습니다.
Forums:
gilgil.net
SO_REUSEADDR 옵션에 대해 알아 보세요.
www.gilgil.net
?
답변 감사합니다. SO_REUSEADDR 은 이미 알고 있습니다.
하지만 제가 궁금한 것은 그게 아니라, SO_REUSEADDR 을 쓰지 않고
TIME_WAIT 가 남아있는 상태에서 같은 포트로 다시 바인딩하면 bind 에서
fail 이 되는 것이 제가 아는 원래의 동작이었고 실제로도 INADDR_ANY 일때는
그렇게 되는 걸 숱하게 봐왔었는데, localhost 인 경우는 에러가 안뜨고
다른 포트로 바인딩이 되버리는(심지어 INADDR_ANY 가 되버리는) 이 기현상이
원래 의도된 동작인가가 궁금한 것입니다.
댓글 달기