소켓종료를 어떻게 알수있죠?
글쓴이: gamgi / 작성시간: 화, 2005/07/05 - 9:59오전
서버/클라이언트 환경에서 프로그래밍 중입니다. 서버에서는 클라이언트의 접속요청을 받아서 전송할 데이터가 있을 경우는 주기적으로 전송을 하고, 없을 경우는 전송할 데이터가 들어올때까지 기다리는 구조입니다. 문제는 클라이언트의 소켓이 종료되었을 경우 어떻게 확인을 하는가입니다. select를 쓰려고 했으나, 이 경우에는 recv()의 리턴값을 통해서 소켓종료를 확인하는 것 같은데 맞는지요? 서버는 데이터 수신을 하지 않으므로, recv()를 굳이 쓰지 않아도 될 듯한데, select를 쓰면서, recv를 하면서 소켓 종료를 확인해야만 하는 건가요?
Forums:
연결종료감지(블록킹모드로 가정)1. read1) select2
연결종료감지(블록킹모드로 가정)
1. read
1) select
2) read이벤트 발생
3) read() ==> 리턴값이 0이면 원격지가 연결종료
2. write
- write ==>리턴값이 < 0 이면 통신에러
3. 시그널로 감지
- write시에 SIGPIPE 발생
- 만일, SIGPIPE를 무시했다면?
write() < 0 인경우 errno를 비교해보면 errno == EPIPE로 감지
4. fcntl로 소켓 상태를 읽는다.
- EBADF라면 연결이 단절된것
댓글 달기