Chapter 15 소켓과 표준 입출력

시캉·2024년 7월 4일
0

ft_irc

목록 보기
12/13

15-1 표준 입출력 함수의 장점

표준 입출력 함수의 두 가지 장점

  • 표준 입출력 함수는 이식성이 좋다.
    : 모든 운영체제가 지원하도록 ANSI C 에서 표준으로 정의했기 때문.

  • 표준 입출력 함수는 버퍼링을 통한 성능의 향상에 도움이 된다.
    : 표준 입출력 함수를 사용할 경우 추가적으로 입출력 버퍼를 제공받음.

기본적으로 소켓을 생성하면 소켓 버퍼를 운영체제로부터 제공받으나, 표준 입출력 함수를 사용하면 입출력 함수 버퍼를 제공받게됨.

소켓 버퍼는 단순히 TCP 구현을 위한 목적으로, 해당 버퍼에 있는 내용이 유실되어 재전송해야하는 경우에 이 버퍼에 있는 데이터를 전송하게 된다.

입출력 함수 버퍼는 성능 향상을 위해 제공된다. 데이터를 패킷으로 포장하여 전송하게 되면, 헤더정보가 데이터의 크기와 관계없이 함께 보내지는데, 이를 버퍼링을 통해 하나의 큰 데이터로 보내게 되면 헤더정보를 여러번 보낼 필요가 없어져서 효율적으로 데이터 송수신이 가능해진다.

표준 입출력 함수 사용에 불편한 사항

  • 양방향 통신이 쉽지 않다.
  • 상황에 따라 fflush 함수 호출이 빈번하게 필요하다.(읽기 -> 쓰기 | 쓰기 -> 읽기 변환 시 버퍼를 비워줘야함)
  • 파일 디스크립터를 FILE 구조체 포인터로 변환해야한다.

15-2 표준 입출력 함수 사용하기

fdopen 함수를 이용한 FILE 구조체 포인터 변환

소켓 생성 시 파일 디스크립터가 반환되는데, 표준 입출력 함수 사용을 위해서는 FILE 구조체 포인터로 변환해야함.

#include <stdio.h>
// 성공 시 FILE 구조체 포인터, 실패 시 NULL 반환
FILE * fdopen(int fildes, const char * mode);
  • fildes : 변환할 파일 디스크립터
  • mode : 생성할 FILE 구조체 포인터의 모드 정보 전달 (ex: "r", "w")

역으로, 파일 구조체 포인터의 파일 디스크립터 값을 반환하는 함수도 존재한다.

#include <stdio.h>
// 성공 시 변환된 파일 디스크립터, 실패 시 -1 반환
int fileno(FILE * stream);

마치며

표준 입출력 함수들을 활용하여 좀 더 효율적인 버퍼 사용으로 성능을 향상시킬 수 있음을 보았다.
fdopen, fputs, fgets, fflush, fclose 등 파일 입출력 함수들을 사용하는 방식이 유용하게 사용될 수 있다는게 신기했다. 파일 디스크립터가 곧 소켓이기에, 소켓을 파일을 다루는 입출력 함수들로 처리한다는 점은 언제나 신기한 부분같다.

기회가 된다면 에코 서버를 표준 입출력 함수를 활용하여 구현해보아도 될 듯 하다. 부가적인 코드 발생으로 단순히 write 하나로 끝날 코드가 복잡해진다는 단점이 있지만, 충분히 상황에 따라 고려해볼만 한 방식이라고 생각한다.

0개의 댓글

관련 채용 정보