소켓 close시 Block되는 현상...
글쓴이: isinji / 작성시간: 월, 2003/10/13 - 9:46오전
일:다수 형태의 socket 프로그램입니다. poll을 사용하여 클라이언트를 처리 중인데 client의 종료시 간혹 서버프로그램에서 이상한 점이 발견됩니다.
poll descriptor set을 검사할 때 POLLHUP이 발생하면 해당 descriptor를 close하고 descriptor를 -1 로 셋합니다. 그런데 간혹 close가 바로 리턴되지 않고 약 2초정도 block 후 return되는 현상일 발생합니다. 현재는 close 전에 alarm(1)을 셋하여 close가 1초 이상 지연되지 않도록 되어있습니다.
따라서 close가 1초 이상 지연될 경우 interrupt되어 해당 descriptor가 poll의 descriptor set에서 빠지지 않으므로 다음 번 poll()에서도 해당 event를 받게 되더군요. 1초 이상 close에서 지연되면 업무에 미치는 영향이 커서 어쩔 수 없이 이렇게 사용하고 있다고 합니다.
혹시 이런 현상을 경험한 분이 계시다면 조언 부탁드립니다.
환경은 HP Alpha Server, Tru64 UNIX Version 5.1입니다.
Forums:
종료 시점의 스트림내의 내용이 중요하지 않다면 소켓 옵션 SO_LINGE
종료 시점의 스트림내의 내용이 중요하지 않다면 소켓 옵션 SO_LINGER 을 사용해서 강제종료를 하시는 것은 어떨지요?
alarm을 썼다고 하셨으니... 문제되지 않을 듯 합니다만...
close시에 인자가 -1 (0xfffffff) 여서 문제가 생겼을 가능
close시에 인자가 -1 (0xfffffff) 여서 문제가 생겼을 가능성이
높습니다.
portability 를 고려하신다면, 가능하면 화일 디스크립터값 자체에 대해서는
close이전에 reset하지 않는게 좋을 듯 합니다.
김성진 드림
PS:유사한 경험이 있었습니다.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
그런 경우였다면 close 의 리턴값 조사만으로도 충분할텐데요...디
그런 경우였다면 close 의 리턴값 조사만으로도 충분할텐데요...
디버깅용 책들을 보면 핸들을 닫는 함수의 리턴값 조사도 아주 중요하다고 합니다.
원인은 찾아냈습니다.socket 옵션에 SO_LINGER를 주었더
원인은 찾아냈습니다.
socket 옵션에 SO_LINGER를 주었더군요... linger를 ON시켜놓은 상태에서 서버측 send buffer에 데이터가 남아있었던 것 같습니다...
답변 주신 모든 분들께 감사드립니다.
댓글 달기