# 지금까지 우리가 구현해 보았던 입출력 스트림 분리
1) (Ch 1O)TCP의 입출력 루틴 분할
- fork함수 호출을 통해 파일 디스크립터 복사 후, 이를 입력용/출력용으로 분리하여 사용
- 입력루틴(코드)과 출력루틴의 독립을 통한 구현의 편의성 증대
- 입력에 상관없이 출력이 가능하게 함으로 인해서 속도의 향상 기대
2) (Ch 15)FILE 포인터를 통한 입출력 분할
- 입력/출력 용도로 파일 구조체 포인터를 만들어 열고, 사용하고, 닫음
- 읽기모드와 쓰기모드의 구분을 통한 구현의 편의성 증대
- 입력버퍼와 출력버퍼를 구분함으로 인한 버퍼링 기능의 향상
# 스트림 분리 이후의 EOF에 대한 문제점
-TCP의 입출력 루틴 분할에서는 Half-close을 통한 EOF 전달의 필요성에 대해 언급하면서
e.g. shutdown(sock, SHUT_WR); 출력스트림 연결을 끊으면서 상대에게 EOF 전달과 같은 방법을 알아보았다.
- 그렇다면, fdopen함수를 통해 파일 디스크립터를 FILE 구조체 포인터로 변환하고,
이를 이용한 입출력 분할에서는 Half-close를 어떻게 할 수 있을까?
- 이 경우, 읽기모드/쓰기모드 FILE 구조체 포인터 둘중 하나에 대해서만
fclose 0를 한다고해서 Half-close가 되지 않으며, 소켓이 완전히 연결 종료됨.
이는 "하나의 파일 디스크립터"를 통해 얻은 FILE 구조체 포인터들이기 때문.
# FILE 구조체 포인터 입출력 분할에서의 Half-close
- 파일 디스크립터를 복사하여, 각각의 파일 디스크립터를 각각 읽기/쓰기모드 파일 구조체 포인터로 만들면 된다.
- 여기서 파일 디스크립터 복사는 fork 함수호출에 의한 것이 아님.
한 프로세스에 원본과 복사본 파일 디스크립터가 모두 있어야 하기 때문.
- 동일한 파일 또는 소켓의 접근을 위한 또 다른 파일 디스크립터의 생성이 필요함.
단순한 정수값 복사를 의미하는 것이 결코 아님
- 모든 파일 디스크립터가 소멸되어야 소켓도 소멸된다 라는 특징을 이용하여
Half-close를 위한 환경 조성이 가능해짐.
- 그러나 이것만으로는 Half-close는 불가능. 하나의 파일 디스크립터를 통해 얻은 파일 구조체 포인터를 닫았다고 해도, 사실상 아직 소켓에 대한 파일 디스크립터가 한 개 남아 있는 것이므로 이 파일 디스크립터를 통해 사실상 입출력 둘다 가능한 상태임.
- 복사된 파일 디스크립터의 수에 상관없이, EOF의 전송을 동반하는 Half-close를 위해서는 "shutdown 함수"를 호출해야 함을 반드시 기억.
dup.c 예제
server.c 예제
client.c 예제
[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어
'컴퓨터 기초 > TCP&IP' 카테고리의 다른 글
18.http 서버 (0) | 2020.08.24 |
---|---|
17.멀티 스레드를 이용한 채팅 서버 (0) | 2020.08.24 |
15.소켓과 표준 입출력 (0) | 2020.08.19 |
14.멀티캐스트 & 브로드캐스트 (0) | 2020.08.18 |
13.다양한 입출력 함수들 (0) | 2020.08.18 |