TCP소켓 Half-close 기법
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 [빨간색코딩]
'기타 > C언어' 카테고리의 다른 글
make 유틸리티 (0) | 2021.03.22 |
---|---|
소켓 옵션과 관련 API (0) | 2021.03.22 |
hostent 구조체, 도메인 관련 API (0) | 2021.03.22 |
(UDP소켓 프로그래밍) socket.h API, connected UDP소켓 (0) | 2021.03.22 |
표준 스트림 (표준출력과 표준오류의 차이) (0) | 2021.03.22 |
구조체의 메모리 저장방식 (0) | 2021.03.22 |
(TCP소켓 프로그래밍) socket.h API, 네트워크 바이트 순서 (0) | 2021.03.22 |
[C] 퀵정렬 예제 정리 (0) | 2019.07.26 |