# 표준 입출력 함수의 두가지 장점
1) 이식성이 좋다
- 모든 표준 함수들은 이식성이 좋음 : 모든 운영제제(컴파일러)가 지원하도록 ANSI C 표준으로 정의했기 때문
2) 버퍼링을 통한 성능의 향상에 도움이 된다
- 소켓을 생성하면 운영제제는 입출력을 위한 버퍼(이하,소켓 버퍼)를 마련하고,
:TCP 프로토콜을 진행하는데 매우 중요한 역할
- 표준 입출력 함수 사용시, 이와는 별도로 추가적인 또 하나의 버퍼(이하, 입출력 함수 버퍼)를 제공받는다.
. 따라서 소켓을 통한 데이터 송수신시 표준 입출력 함수를 사용하여 데이터를 전송할 경우,거쳐야 하는 버퍼는 총 "2개"이다.
# 데이터 전송시 과정
1) 데이터가 표준 입출력 함수의 출력버퍼에 전달됨
2) 이어서 소켓의 출력버퍼로 데이터가 이동
3) 이어서 상대 호스트로 데이터가 전송됨
# 데이터 수신시 과정
1) 데이터가 소켓의 입력버퍼로 전달됨
2) 이어서 표준 입출력 함수의 입력버퍼로 이동
3) 이어서 호스트가 데이터를 수신함
# 버퍼
- 기본적으로 성능의 향상이 목적
- 그러나, 소켓 버퍼는 TCP의 구현을 위한 목적이 더 강함.
e.g. TCP에서는 데이터가 분실되면 재전송을 진행하는데,
이것은 데이터를 소켓의 출력버퍼에 저장해놓고 있었기 때문에 가능한 것.
- 반면 표준 입출력 버퍼는 "오로지 성능 향상만을 목적”으로 제공이 됨
- 전송해야 할 데이터의 양이 많을수록 버퍼링의 유무에 따른 성능의 차이는 커짐
- 버퍼링이 미치는 성능의 우월함
10바이트를 전송하고자 하는 상황에서,
1.1 바이트짜리 데이터를 열 개의 패킷에 보내는 경우
2.10바이트짜리 데이터를 한 개의 패킷에 보내는 경우를 고려해보자.
데이터 전송을 위해 구성된 패킷에는 ”헤더정보”라는 것이 추가되는데,
이는 전송하는 데이터 크기에 상관없이 일정한 크기구조를 갖는다.
만약 헤더정보의 크기를 40바이트로만 잡아도(실제로는 이보다 크다고 함)
1) 전송하는 데이터 양
1. 40 x 10 = 400바이트
2. 40x1 =40바이트
2) 출력버퍼로의 데이터 이동 횟수 : 데이터 전송을 위해
입출력 함수 버퍼에서 소켓의 출력버퍼로 이동시키는 데도 제법 많은 시간이 소모된다.
1 이동 횟수 10번
2. 이동 횟수 1 번
=> 1),2)를 고려해보았을 때, 버퍼링은 데이터 송수신 성능에 큰 영향을 미친다는 것을 알 수 있다.
# 단순한 파일 복사조차도 시스템 함수보다 표준 입출력 함수 사용이 훨씬 빠르다.
따라서, 실제 네트워크 상에서 데이터를 송수신하는 것이면 더 말할 필요가 없다.
# 표준 입출력 함수의 단점
- 양방향 통신이 쉽지 않음
- 상황에 따라서 fflush 함수의 호출이 빈번히 등장할 수 있음
: 버퍼링 문제로 인해 읽기 => 쓰기, 쓰기 => 읽기 작업의 전환할 때마다,
fflush 함수를 호출해야 하는데, 이렇게 되면 표준 입출력 함수의 장점인 버퍼링 기반의 성능향상에도 영향을 미침
- 파일 디스크립터를 FILE 구조제의 포인터로 변환해야 함
: 기본적으로 소켓은 파일 디스크립터를 반환하는데,이를 표준 입출력함수에 사용하려면 FILE 포인터로 변환하는 과정을 거쳐야 함.
# 소켓 기반에서의 표준입출력 사용
- 크게 달라질 것은 없으나, 데이터 송수신시에 파일 디스크립터를 이용한 시스템함수(read, write)가 아니라
FILE 구조제포인터를 이용한 표준 입출력함수((fgets, fputs)를 사용하면 된다.
- 파일 디스크립터를 FILE 구조제 포인터로 변환하고, 이를 통해 파일을 열고 fc lose 0하면 파일(소켓) 자제가 완전히 종료되기 때문에, 따로 close(파일 디스크립터) 를 또 해줄 필요는 없다.
open.c 예제
fopen.c 예제
pointertodes.c 예제
destopointer.c 예제
sender.c 예제
receiver.c 예제
[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어
'컴퓨터 기초 > TCP&IP' 카테고리의 다른 글
17.멀티 스레드를 이용한 채팅 서버 (0) | 2020.08.24 |
---|---|
16.입출력 스트림의 분리에 대한 나머지 이야기 (0) | 2020.08.19 |
14.멀티캐스트 & 브로드캐스트 (0) | 2020.08.18 |
13.다양한 입출력 함수들 (0) | 2020.08.18 |
12.멀티플렉싱 (0) | 2020.08.14 |