본문 바로가기
Develop/Network

[윤성우의 열혈 TCP/IP 소켓 프로그래밍] Chapter15 - 내용 확인 문제 풀이

by Tarra 2023. 7. 1.

 

 

 

 

 [윤성우의 열혈 TCP / IP 소켓 프로그래밍] 책을 기반으로 개인적으로  문제 풀이 및 개념을 정리한 내용입니다.

모든 소스 코드와 강의, 확인 문제의 정확한 답안은 (23년 7월 1일부터 전면 무료화 예정)

http://www.orentec.co.kr/

 

====== 오렌지 미디어 ======

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

 

01. 표준 입출력 함수를 사용했을 때 얻게 되는 장점 두 가지는 무엇인가? 그리고 그 두가지 장점을 얻게 되는 이유는 또 무엇인가?

1. 이식성

표준 입출력 함수는 C/C++ 언어의 표준 라이브러리에 속하므로, 여러 운영체제에서 지원되는 표준화된 인터페이스를 제공한다.

따라서, 프로그램을 다른 플랫폼 또는 운영체제로 이식할 때에도 코드 변경 없이 그대로 사용할 수 있다.

이식성은 크로스 플랫폼 개발이나 이식성이 중요한 환경에서 유용하다.

 

2. 단순성

여러 표준 입출력 함수는 간단하고 직관적인 형식으로 데이터를 입출력할 수 있도록 설계되어 있다.

이로 인해 프로그래머들은 복잡한 입출력 로직을 작성하는 대신 간단한 형식 지정자를 사용하여 데이터를 처리할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있다.

 

이러한 장점을 얻는 이유는 다음과 같다.

- 표준 입출력 함수는 운영체제와 독립적인 추상화된 인터페이스를 제공한다.

운영체제 또는 하드웨어에 따라 입출력 함수를 직접 구현하거나, 조작할 필요가 없으므로 이식성이 뛰어나다.

 

- C/C++ 표준 라이브러리는 많은 개발자들에 의해 사용되며, 많은 테스트와 최적화가 이루어져 안정성과 성능이 검증되어 있다.

이로 인해 신뢰성이 높고 프로그래머가 직접 입출력 함수를 구현하는 것보다 안정적으로 데이터를 처리할 수 있다.

 

더보기

모범 답안

이식성이 좋아지고 버퍼링을 통한 성능의 향상에 도움이 된다.

표준 입출력 함수는 모든 운영체제에서 동작하는 함수들이기 때문에 이식성이 좋아진다.

그리고 표준 입출력 함수를 사용하면 소켓의 입출력 버퍼의 앞 단계에서 성능의 향상을 목적으로 하는 입출력 버퍼가 하나 더 추가되기 때문에 성능의 향상에도 도움이 된다.

 

 

02. 표준 출력함수를 이용해서 데이터를 전송하는 경우에는 다음과 같이 생각하는 것은 옳지 않다.

"fputs 함수호출을 통해서 데이터를 전송하면, 함수가 호출되자마자 데이터의 전송이 시작될 거야!"

그렇다면 위와 같은 생각이 옳지 않은 이유는 무엇이고, 위와 같이 생각하기 위해서는 추가로 어떠한 과정이 필요한지 설명해보자.

'fputs' 함수 호출은 데이터의 전송을 보장하지 않는다. 실제로 데이터가 전송되는 시점은 여러 요소에 의해 결정될 수 있다.

 

표준 출력 함수는 사용하여 데이터를 전송하는 경우, 일반적으로 데이터는 버퍼에 쌓이고, 버퍼의 크기나 특정 이벤트(예: 개행문자)가 발생하는 등의 조건을 충족했을 때 실제로 전송된다.

따라서 'fputs'함수 호출 자체로는 데이터의 즉시 전송을 보장하지 않는다.

 

만약 데이터를 즉시 전송하고자 한다면, 추가적인 과정이 필요하다.

일반적으로 "버퍼의 비우기" 또는 "스트림의 강제 플러싱" 이라고 알려진 작업을 수행해야 한다. 

 

1. 'fflush' 함수 호출

'fflush' 함수는 출력 버퍼를 비우고 해당 스트림에 대한 데이터 전송을 강제한다.

 

2. 표준 출력 스트림 설정 변경

'setbuf(stdout, NULL)'을 호출하여 버퍼링을 비활성화 하거나, 'setbuf(stdout, NULL, _IONBF', 0)'을 호출하여 버퍼링 모드를 설정할 수 있다.

 

더보기

모범 답안

표준 출력함수를 통해서 전송되는 데이터는 바로 소켓의 출력버퍼로 이동하지 않고, 표준 출력 함수의 버퍼에 저장된다.

그 다음에야 출력버퍼로 데이터가 이동을 한다. 

따라서 fputs 함수가 호출된다고 해서 바로 데이터의 전송이 진행되는 것은 아니다.

만약에 함수호출 이후에 바로 이어서 데이터의 전송을 보장받고 싶다면 fflush 함수의 호출과정을 거쳐야 한다.

 

 


출처 : [윤성우의 열혈 TCP / IP 소켓 프로그래밍] / 윤성우 저 / 오렌지 미디어

https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com