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 리턴 )

 

질문에 대한 정확한 이해를 못하여서 일단 안정적인 접속 종료에 대하여 말씀드렸습니다. 도움이 되시기를 ^^

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,