모든 내용은 [윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!
01. 표준 입출력 함수를 사용했을 때 얻게 되는 장점 두 가지는 무엇인가? 그리고 그 두가지 장점을 얻게 되는 이유는 또 무엇인가?
# 표준 입출력 함수의 두가지 장점
1) 이식성이 좋다
- 모든 표준 함수들은 이식성이 좋음 : 모든 운영체제(컴파일러)가 지원하도록 ANSI C 표준으로 정의했기 때문
2) 버퍼링을 통한 성능의 향상에 도움이 된다
- 소켓 버퍼는 TCP의 구현을 위한 목적이 더 강하지만,
- 표준 입출력 버퍼는 "오로지 성능 향상만을 목적"으로 제공이 됨
# 버퍼링이 미치는 성능의 우월함
10바이트를 전송하고자 하는 상황에서,
1. 1바이트짜리 데이터를 열 개의 패킷에 보내는 경우
2. 10바이트짜리 데이터를 한 개의 패킷에 보내는 경우
를 고려해보자.
데이터 전송을 위해 구성된 패킷에는 "헤더정보"라는 것이 추가되는데,
이는 전송하는 데이터 크기에 상관없이 일정한 크기구조를 갖는다.
만약 헤더정보의 크기를 40바이트로만 잡아도(실제로는 이보다 크다고 함),
1) 전송하는 데이터 양
1. 40 x 10 = 400바이트
2. 40 x 1 = 40바이트
2) 출력버퍼로의 데이터 이동 횟수 : 데이터 전송을 위해
입출력 함수 버퍼에서 소켓의 출력버퍼로 이동시키는 데도 제법 많은 시간이 소모된다.
1. 이동 횟수 10번
2. 이동 횟수 1번
=> 1), 2)를 고려해보았을 때, 버퍼링은 데이터 송수신 성능에 큰 영향을 미친다는 것을 알 수 있다.
02. 표준 출력함수를 이용해서 데이터를 전송하는 경우에는 다음과 같이 생각하는 것은 옳지 않다.
"fputs 함수호출을 통해서 데이터를 전송하면, 함수가 호출되자마자 데이터의 전송이 시작될 거야!"
그렇다면 위와 같은 생각이 옳지 않은 이유는 무엇이고, 위와 같이 생각하기 위해서는 추가로 어떠한 과정이 필요한지 설명해보자.
- 표준 출력함수를 통해서 전송한 데이터는 일단 표준 출력버퍼로 이동한다. 그 이후에, 소켓의 출력버퍼로 이동하게 된다.
- 따라서 fputs 함수 호출 이후 바로 데이터의 전송이 되길 원한다면, 표준 출력함수 호출 이후 fflush 함수 호출을 통해 표준 출력버퍼를 강제로 비워 데이터가 소켓의 출력버퍼로 이동되게 해야 한다.
[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어
'Programming > 열혈 TCP, IP 소켓 프로그래밍(저자 윤성우)' 카테고리의 다른 글
Ch 16. 내용 확인문제 (0) | 2020.08.10 |
---|---|
Ch 16. 입출력 스트림의 분리에 대한 나머지 이야기 (0) | 2020.08.10 |
Ch 15. 소켓과 표준 입출력 (0) | 2020.08.10 |
Ch 14. 내용 확인문제 (0) | 2020.08.09 |
Ch 14. 멀티캐스트 & 브로드캐스트 (3) | 2020.08.09 |