Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- javascript
- ajax
- network
- Static
- Java
- git
- github
- NoSQL
- Lombok
- spring
- html
- reactive
- 데이터통신
- libuv
- socket
- Heap
- 네트워크
- AWS
- effective
- mybatis
- VCS
- mongodb
- HTTP
- Elk
- nodejs
- reactor
- redis
- cache
- r
- Linux
Archives
- Today
- Total
빨간색코딩
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 : 입출력 스트림 종료
'C' 카테고리의 다른 글
아두이노 bluetooth (0) | 2017.04.02 |
---|---|
아두이노 Digita I/O & Analog I/O (0) | 2017.04.02 |
(UDP소켓 프로그래밍) socket.h API, connected UDP소켓 (0) | 2017.03.27 |
표준 스트림 (표준출력과 표준오류의 차이) (0) | 2017.03.22 |
구조체의 메모리 저장방식 (0) | 2017.03.18 |
Comments