본문 바로가기

TCP-IP 소켓 프로그래밍

TCP 소켓의 우아한 연결종료(Half-close)를 이해해보자

들어가며


Half-close?? 이게 뭘까? 상대방 소켓이 데이터를 보내는 중인데 연결을 끊어버린다면, 심지어 그게 중요한 데이터였다면 큰일 날 것이다..! 이런 경우는 어떻게 해야 할까?

Half Close


일방적인 연결종료의 문제점은 서두에서 이해했을 것이다. 연결 종료를 좀 더 자세히 살펴보자.

TCP소켓은 두 개의 스트림을 가지고 있다. (스트림? -> 두 소켓이 연결되어 데이터가 송수시 가능한 상태를 스트림으로 봄) 스트림은 양방향이 아닌 한 방향이기 때문에 각 각 다른 방향의 스트림이 2가지 존재하는 것이다.

결국 Half-close란?

스트림을 한쪽만 닫아, 보낼 순 없지만 받을 순 있는 상태, 받을 순 없지만 보낼 순 있는 상태를 만드는 것을 의미한다.

Half-Close의 필요성

굳이 써야 할까? 그냥 모두 송/수신될 때까지 기다리는 방법은 잘못된 걸까? 여유가 있는 상황이라면 그래도 괜찮다. 하지만 데이터를 보낸 후 "End"라는 메시지를 보내야만 하고, 바로 연결을 종료해야 한다고 가정하면, Half-Close가 필요하다.

Half-Close 사용법

WinSock에선 shutdown함수를 사용한다.

#include<winsock2.h>

int shutdown(SOCKET sock, int howto);

매개변수론 종료 소켓, 종료방법이 들어간다. 종료방법은 3가지로 나뉜다.

  • SD_RECEIVE: 입력 스트림 종료
  • SD_SEND: 출력 스트림 종료
  • SD_BOTH:입출력 스트림 종료

 

마무리


공부를 하면서도 이걸 사용할까..? 라는 생각이 가끔 들곤하는데, 종료함으로 인해 정말 중요한 정보를 받지 못한다고 생각해보면 Half-Close는 평소에도 철저하게 지켜야한다고 생각이 된다.

참고