들어가며
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는 평소에도 철저하게 지켜야한다고 생각이 된다.
참고
'TCP-IP 소켓 프로그래밍' 카테고리의 다른 글
Nagle 알고리즘을 이해해보자 (0) | 2023.09.04 |
---|---|
주소할당 에러(Binding Error)를 이해해보자 (1) | 2023.09.04 |
UDP를 파헤치며 이해해보자 (0) | 2023.08.29 |
TCP의 내부 동작 원리를 이해해보자 (1) | 2023.08.28 |
TCP/IP 프로토콜을 이해해보자 (1) | 2023.08.28 |