Linux 에서 특정 port를 listen 불가능 하게 될 때.

yykim의 이미지

종종 겪는 일입니다만,
간혹가다 linux에서 특정 포트를 listen할 수 없습니다.
물론 그 포트는 아파치에 필요한 부분의 모듈을 만들어서 다른 것을
테스트한 상태고요, 그 데몬이 이상해져서 완전 종료후,
netstat -na 나 socklist 등으로 찾아도 해당되는 port가 없을 때,
다시 실행하면 make_sock 을 할 수 없다고 나옵니다.

혹시나 하는 마음에, 직접 listen하는 프로그램을 짜봐도 같은 에러만
나오고 있습니다.

1~2달에 한번 정도 발생하는데, 이 문제를 아시는 분 도움을 부탁드리
겠습니다.....

ajoupark의 이미지

무슨 증상인지 잘 이해는 안되는데..
socket option 중에 SO_REUSEADDR 을 한번 보시지요...
http://www.ibrado.com/sock-faq/#faq44

/** 주워 들은 것도 내 것이다. 많이 주워 들어야지*/

yykim의 이미지

ajoupark wrote:
무슨 증상인지 잘 이해는 안되는데..
socket option 중에 SO_REUSEADDR 을 한번 보시지요...
http://www.ibrado.com/sock-faq/#faq44

^^ 물론 REUSE 중입니다... 해당되는 포트는 죽어도 Listen이 안되더군요
리붓을 하면 증상이 사라집니다... _-_.
dmesg나 /var/log/message secure 등에 특이한 로그도 없습니다.

verena의 이미지

윗분의 말에 덧붙여서...

윗분이 resueaddr을 사용하라고 한 의미를 설명해 드리겠습니다.

소켓이 bind한 address/port 패어에 대해서 reuseaddr을 사용하는것은 해당 소켓이 이 주소를 반환하고 나면 즉시 사용할 수 있는 기능도 포함되어 있습니다.

이와 관련된 사이트로는

http://www.sandelman.ottawa.on.ca/linux-ipsec/html/1999/04/msg00021.html

해당 사이트에 dead socket의 time out에 대한 내용이 나타나 있습니다. time out시간은 보통 시간단위라고 하는군요...

verena의 이미지

아 그리고 대부분의 소켓을 사용하는 어플리케이션이나 데몬들은 reuseaddr을 사용하지 않는다고 하더군요...

아무래도 제가 쓴글들은 도움이 되지 않을듯하네요... ㅡㅜ

yykim의 이미지

verena wrote:
윗분의 말에 덧붙여서...

윗분이 resueaddr을 사용하라고 한 의미를 설명해 드리겠습니다.

소켓이 bind한 address/port 패어에 대해서 reuseaddr을 사용하는것은 해당 소켓이 이 주소를 반환하고 나면 즉시 사용할 수 있는 기능도 포함되어 있습니다.

^^ 커널상의 문제인 것 같다는 것은 netstat 등에서 TIME_WAIT도 없는 깨끗한
상황이라는 뜻입니다.
혹시나 이런 상황을 겪으신 분이 있나 해서 여쭈어본거고요, reuseaddr 옵션을 준 테스트도 다 해보았습니다.. ^^.......

xfmulder의 이미지

make_sock 은 어떤건지 ...

또, 실패후 errno 가 어떤 값으로 되던가요?

내 자식들도 나처럼 !!

pynoos의 이미지

lsof -i

로 해도 발견이 안되던가요?

yykim의 이미지

lsof로는 체크를 못해봤고요,
Already Port Open 이 나는군요...
잦은건 아닙니다.. 2~3달에 한건 정도 발생을 하니...