1. 소켓 연결 종료의 문제점(이는 TCP기반을 말한다.)

TCP 기반에서 closesocket()함수를 호출하게 되면 연결을 완전 종료한다는 의미이다. 여기에 한 가지 문제점이 있다.

 

만약 Host A Host B에게 메시지를 보내고 Host A closesocket 함수를 호출해 연결을 종료 했다면, Host B에서 Host A로 전송되고 있는 메시지가 있을 때, 그 메시지는 전송을 완료하지 못하고 중간에 소멸되고 말것이다. (여기서 closesocket함수는 출력 스트림과 입력 스트림을 모두 종료하는 기능을 한다.)

이 문제를 해결하기 위해 소켓 스트림의 일부만 종료(half close)하는 방법에 대해 알아볼 것이다.

 

다음은 half close를 하는 함수이다.

 

int shutdown(SOCKET s, int how);

s : half-close를 할 소켓의 핸들이다.

How : 종료모드를 인자로 전달한다.

 

다음에 how에 들어갈 종료모드들이다.

상수 값

모드

정의

0

SD_RECEIVE

입력 스트림 종료

1

SD_SEND

출력 스트림 종료

2

SD_BOTH

/ 출력 스트림 종료

 

다음과 같이 만약 출력 스트림만 종료를 하게 된다면, Host B에서 Host A로 전송중인 메시지는 입력 스트림이 아직 열려 있기 때문에 무사지 전송이 가능하게된다.

 

 

 

 

 

 

2. 출력 스트림의 종료의 필요성

메시지가 모두 무사히 전송되고 나서 closesocket를 이용해 종료하면 되지 출력 스트림의 종료가 왜 필요한 것인가?에 대해 알아보자.

 

출력 스트림을 종료하게 되면, 데이터 전송의 끝을 알려주는 EOF 메시지를 연결 되어 있는 호스트로 보내게 된다. 그리고 EOF 전송 시 상대 호스트의 데이터 수신함수(read, recv) 0을 반환한다.

 

출력 스트림을 종료하는 방법에는 shutdown 함수를 이용하여 종료 할 수도 있고, closesocket를 이용해도 입력 스트림과 함께 출력 스트림 또한 종료 되므로 EOF메시지가 전송된다.

 

다음 그림을 보면, 파일을 모두 보내고 EOF 메시지를 전송하고 있다. Clinet에서는 EOF메시지를 받고 파일이 모두 전송되었다는 것을 알아차리고 Thank you메시지를 보내게 된다. 만약 입력 스트림과 출력 스트림 모두 종료하게 된다면 Thank you 메시지는 받지 못할 것이다. 또한 EOF메시지를 보내지 않는다고 한다면, Client는 파일 전송이 언제 끝나는지도 모르는 채 파일이 전송을 계속 기다리게 되고, 한편 Server측에서는 파일을 다 전송하고 확인 메시지를 계속 기다리게 되어 server / client 모두 무한 대기 상태에 빠지게 된다.
 

 

'API & MFC > 네트워크프로그래밍' 카테고리의 다른 글

EventSelect(클)  (0) 2010.02.05
EventSelect(서버)  (0) 2010.02.05
EventSelect란?  (0) 2010.02.05
ASyncSelect 예제  (1) 2010.02.04
소켓통신의 라이브러리 사용 선택 시 고려사항  (0) 2010.02.02
Posted by 아몰라