close()
를 통해 소켓을 닫아버리면, 필수적으로 받아야할 데이터를 받지 못하거나, 보내지 못하는 경우가 생긴다.
-> Half-close
하여 수신 또는 송신만 닫아서 문제 발생을 줄인다.
두 소켓이 연결되면 데이터의 송 수신이 가능한 두 개의 스트림이 생성된다.
스트림은 단 방향이므로 A -> B / B -> A로 각각 존재한다.
Half-close는 결국 두 스트림 중 하나의 스트림만 먼저 종료하는 상태를 의미한다.
#include <sys/socket.h>
int shutdown(int sock, int howto);
// 성공 시 0, 실패 시 -1 반환
첫 번째 인자 : Half-close할 소켓
두 번째 인자 : SHUT_RD
입력 스트림 종료, SHUT_WR
출력 스트림 종료, SHUT_RDWR
입출력 스트림 종료
두 소켓이 파일을 주고 받는다고 할 때, 파일을 다 보냈다면 EOF를 날려서 더이상 보낼 파일이 없음을 알려야함.
이를 소켓을 닫는 방법으로 EOF를 전달할 수 있는데, close
로 냅다 닫으면 파일을 받고 있던 상대 소켓도 닫혀서 데이터를 다 받지 못하는 에러가 발생할 수 있음.
이를 위해 Half-close를 하여 소켓의 출력 스트림을 닫으면, 상대 소켓에 EOF가 들어가게 된다.
이후 상대 소켓이 모든 데이터를 받고 ACK를 보내면 이 데이터는 입력 스트림으로 들어오게 되어 데이터 흐름 제어에 문제가 없게 된다.