서버 종료시 연결된 클라이언트 연결 종료 문제..
글쓴이: hatbary / 작성시간: 목, 2003/11/20 - 8:11오후
rpc 스타일의 서버를 만들고 있습니다..개발 환경은 레드햇 리눅스 8.0이구요..물론 gcc 컴파일러 사용하구요..
서버가 accept를 하고 있다가 연결이 들어오면 detatch된 스레드를 만드는 방식인데요...
어쩌다가 세그먼트 오류같은 예상치 못한 에러처리를 하려구 하거든요..
그래서 SIGSEGV시그널이 들어오면 로그 남기구, 다시 서버를 재시작하려구 합니다...
근데 rpc스타일이다 보니깐 클라이언트의 접속횟수도 잦고, 연결이 오래 지속되는 것은 아니라 종료되는 시점에 클라이언트와의 연결이 종료되지 않는 문제가 있습니다...
즉, 서버를 종료했는데도, 가끔씩 netstat -an으로 보면 아직 ESTABLISHED상태로 남아있는 글라이언트가 있습니다..
이것때문에 서버를 재시작 하려구 해두, 바인드 에러가 나서 즉시 서버를 재시작 할수 없거든요..
게다가 연결 상태가 FIN_WAIT2라두 되면 얼마 정도 시간이 흐른뒤에 다시 띄울수 있지만 ESTABLISHED되어 있는 것은 시스템을 재부팅 하지 않는한 사라지지 않습니다..
서버를 종료 시킬때 연결되어 있는 클라이언트의 연결을 강제로 종료시킬수 있는 방법이 있는지 알고 싶습니다.
참고로 디버깅을 위해 서버를 데몬으로 만들지 않고, 전면 프로세스로 나와 작업하고 있습니다. 종료는 일반적인 SIGINT시그널로 종료되구요..
그럼 고수님들의 답변에 미리 감사드리면서..꾸벅^^
Forums:
소켓 옵션 SO_REUSEADDR 하고는 상관없었나요?
소켓 옵션 SO_REUSEADDR 하고는 상관없었나요?
SO_REUSEADDR은 보안상 문제가 있을수 있다는 이야기가 있어서,
SO_REUSEADDR은 보안상 문제가 있을수 있다는 이야기가 있어서, 사용안하구요..SO_LINGER를 사용하거든요..
SO_REUSEADDR을 사용하는 것에 대한 정확한 의미도 잘 모르구요..
조금만 더 자세히 알고 싶은데...답변주시면 정말 고맙겠습니다.
서버 재시작시에 같은 주소를 바인드해야한다면 SO_REUSEADDR을 사
서버 재시작시에 같은 주소를 바인드해야한다면 SO_REUSEADDR을 사용해야 하는게 맞습니다. 혹은 서버 종료시에 기존 접속을 다 끊어버리도록 해야겠지요. (모든 프로세스 혹은 쓰레드에서 소켓을 닫아버리도록...)
보안 문제라고 해도, 외부인 계정이 존재하지 않는다면 문제될건 없습니다. 신뢰할 수 있는 사람만이 사용한다면 역시 문제 없고요. 혹은, 루트 권한이 필요한 1024번 내에서 포트를 지정한다면 어짜피 SO_REUSEADDR을 사용해도 다른 사람이 접근할 수 없기 때문에 문제가 없습니다.
오~~그런것이었군요..고수님들의 답변에 그저 고마울 따름입니다..
오~~그런것이었군요..
고수님들의 답변에 그저 고마울 따름입니다..
근데 궁금한게 하나 더있는데요..
소켓을 SO_REUSEADDR을 사용하면은요..바인드는 되는 문제는 해결할수 있다면, 이전에 말씀드린, 서버 종료시 ESTABLISHED되어 있던 연결들은 어떻게 되나요? 그냥 그 상태로 남아 있나요? 아님 사라지나요?
저도 궁금하네요. 해보시고 결과를 꼭 알려주시면 고맙겠습니다.
저도 궁금하네요. 해보시고 결과를 꼭 알려주시면 고맙겠습니다.
[quote="hatbary"]소켓을 SO_REUSEADDR을 사용하면은
SO_REUSEADDR을 사용하게 되면, TIME_WAIT 상태로 걸리게 됩니다.
물론, 이 TIME_WAIT은 system에서 설정되어 있는 값 만큼 대기하게 되겠죠.
헙!! 되는군요...흠..고수님들의 답변에 그저 고마울따름임다...
헙!! 되는군요...흠..고수님들의 답변에 그저 고마울따름임다...
글구 연결된 클라이언트는 TIME_WAIT에 걸리는게 맞는거 같네요...
정확하게 확인을 못했지만..워낙 빨리 사라져서...ㅡㅡ;
댓글 달기