TCP소켓 Half-close 기법

2021. 3. 22. 00:47 기타/C언어

1. Half-close란?

1-1. 일방적인 close()의 문제점

A호스트와 B호스트가 서로 TCP통신하고 있다. 그러나 A호스트가 일방적으로 close()로 연결을 종료하면 B호스트는 A호스트로 데이터를 보낼게 있어도 보낼 수 없다. 따라서 일방적으로 송수신 스트림을 끊어버리는 건 문제가 있으므로, 하나의 스트림(주로 송신을 닫고, 수신을 열어둠)만 닫는 것을 Half-close 기법이라고 한다.

1-2. Half-close가 필요한 이유

서버는 단순히 데이터를 연속해서 전송하면 되지만, 클라이언트는 언제까지 데이터를 수신해야 하는지 알 수 없다. 주기적으로 read()함수를 호출하다가는 블로킹(호출된함수가 반환되지 않음) 상태에 빠질 수도 있다. 그러므로, 데이터전송이 끝났음을 알리는 EOF를 날리면 된다. 하지만 close()를 통해 EOF를 날리면 이후 혹시모를 데이터를 수신할 수 없으므로, 출력스트림만 닫아서 EOF를 보내는 것이다

2. Half-close 함수

#include <sys/socket.h>

int shutdown(int sock, int howto);

2-1. 반환값

성공 = 0, 실패 = -1

2-2. 인자

sock : 파일 디스크립터

howto : 종료방법

  • SHUT_RD : 입력 스트림 종료
  • SHUT_WR : 출력 스트림 종료
  • SHUT_RDWR : 입출력 스트림 종료



출처: https://sjh836.tistory.com/46?category=680969 [빨간색코딩]