Winsock2.2에서 바뀐 것인지는 모르겠습니다만, 클라이언트가 종료될때는 2가지 경우가 있습니다.
1. Graceful close
-> 클라이언트가 shutdown으로 서버에게 클라이언트의 종료를 알려준후 종료
2. Not graceful close
-> 클라이언트가 shutdown을 보내지 않고 바로 closesocket을 한 경우
되도록이면 1번의 경우가 되도록 권장을 하고 있습니다. 이유는 서버에서 안정적으로 클라이언트의 접속종료를 알아내기 위해서이죠.
아래는 MSDN에서 발췌한 "Graceful shutdown, linger options and socket closure" 입니다.
Client Side | Server Side |
---|---|
(1) Invoke shutdown(s, SD_SEND) to signal end of session and that client has no more data to send. | |
(2) Receive FD_CLOSE, indicating graceful shutdown in progress and that all data has been received. | |
(3) Send any remaining response data. | |
(5') Get FD_READ and invoke recv to get any response data sent by server | (4) Invoke shutdown(s, SD_SEND) to indicate server has no more data to send. |
(5) Receive FD_CLOSE indication | (4') Invoke closesocket |
(6) Invoke closesocket |
님께서는 2번의 방법으로 클라이언트를 종료하셨는데, 이 경우 서버에서는 2가지로 종료를 확인하셔야 합니다.
1. recv에서 0이 리턴되는 경우(받은 데이타 사이즈가 0인경우)
2. recv에서 소켓에러가 떨어지는 경우( -1 리턴 )
질문에 대한 정확한 이해를 못하여서 일단 안정적인 접속 종료에 대하여 말씀드렸습니다. 도움이 되시기를 ^^
'Development > 네트워크 프로그래밍' 카테고리의 다른 글
IP String -> DWORD 로 변환 (0) | 2011.08.13 |
---|---|
IOCP 예제 코드 (0) | 2011.08.13 |
패킷 압축 방법 (0) | 2011.08.13 |
서브넷 계산 및 표현법, 192.168.0.0/32, CIDR (0) | 2011.08.13 |
[펌] IOCP를 이용한 서버 만들기 (0) | 2011.08.13 |
안정적인 DNS서비스 DNSEver