소켓 통신시 서버가 close() 시 클라이언트가 반응이 없을 때...
글쓴이: vananamilk / 작성시간: 일, 2011/01/16 - 12:23오후
안녕하세요.
서버프로그램 클라이언트 프로그램이 있습니다.
서버가 시작되면 클라이언트가 서버로 접속을 하구요.
서버 -> 클라이언트로 데이터를 보내는 구조입니다.
클라이언트는 recv()가 실패하면 접속을 끊고 다시 접속하구요.
접속유지를 위해 주기적으로 서버 -> 클라이언트 -> 서버로
데이터를 주고 받습니다.
하지만 서버 프로그램을 재시작하면 간혹 클라이언트에서 접속
종료를 알지 못하고 다시 재접속을 하지 않는 문제가 있네요.
서버 프로그램 재시작시 핸들러를 이용해 모든 소켓을 다 close()
해 주는데도 이런 문제가 발생하는데 원인이 무엇을까요?
도움 부탁드립니다.
Forums:
답변이라기보다는;;;
의견입니다.
접속유지
- 클라이언트는 유니크한 키값 (중복 접속방지)
- 주기적인 데이터 전송후 일정시간동안 패킷을 송수신 못하면 서버 또는 클라이언트에서 close.
close시 time_wait등이 일어나지 않도록 넌블로킹 소켓으로 변경.후 close
종료시점은 이미 알고 계실거같습니다.
close 이벤트가 호출 되지 않더라도 주기적인 데이터 전송이 없는지 확인하면 되니까요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
음..
close() 하게되면 FIN 신호가 갈듯한데요..
서버종료시에, 클라이언트 recv() 리턴값 체크 한번 해보시길..
정상적으로 재접속할때와, 그렇지 않을때에 리턴값이 틀릴것 같은데..
클라이언트에 오류가 있는 것 아닌가 싶습니다.
위, 메이즈님 댓글처럼 서버가 종료했는데도 클라이언트가 감지를 못한다는
것 자체가 문제입니다. 만약 클라이언트 오류가 없다면
중간의 어느 장비가 FIN을 먹어버린다는 얘기 밖에 안됩니다.
댓글 달기