표준 입출력 함수는 이식성이 좋다.
: 모든 운영체제가 지원하도록 ANSI C 에서 표준으로 정의했기 때문.
표준 입출력 함수는 버퍼링을 통한 성능의 향상에 도움이 된다.
: 표준 입출력 함수를 사용할 경우 추가적으로 입출력 버퍼를 제공받음.
기본적으로 소켓을 생성하면 소켓 버퍼를 운영체제로부터 제공받으나, 표준 입출력 함수를 사용하면 입출력 함수 버퍼를 제공받게됨.
소켓 버퍼는 단순히 TCP 구현을 위한 목적으로, 해당 버퍼에 있는 내용이 유실되어 재전송해야하는 경우에 이 버퍼에 있는 데이터를 전송하게 된다.
입출력 함수 버퍼는 성능 향상을 위해 제공된다. 데이터를 패킷으로 포장하여 전송하게 되면, 헤더정보가 데이터의 크기와 관계없이 함께 보내지는데, 이를 버퍼링을 통해 하나의 큰 데이터로 보내게 되면 헤더정보를 여러번 보낼 필요가 없어져서 효율적으로 데이터 송수신이 가능해진다.
소켓 생성 시 파일 디스크립터가 반환되는데, 표준 입출력 함수 사용을 위해서는 FILE 구조체 포인터로 변환해야함.
#include <stdio.h>
// 성공 시 FILE 구조체 포인터, 실패 시 NULL 반환
FILE * fdopen(int fildes, const char * mode);
역으로, 파일 구조체 포인터의 파일 디스크립터 값을 반환하는 함수도 존재한다.
#include <stdio.h>
// 성공 시 변환된 파일 디스크립터, 실패 시 -1 반환
int fileno(FILE * stream);
표준 입출력 함수들을 활용하여 좀 더 효율적인 버퍼 사용으로 성능을 향상시킬 수 있음을 보았다.
fdopen, fputs, fgets, fflush, fclose 등 파일 입출력 함수들을 사용하는 방식이 유용하게 사용될 수 있다는게 신기했다. 파일 디스크립터가 곧 소켓이기에, 소켓을 파일을 다루는 입출력 함수들로 처리한다는 점은 언제나 신기한 부분같다.
기회가 된다면 에코 서버를 표준 입출력 함수를 활용하여 구현해보아도 될 듯 하다. 부가적인 코드 발생으로 단순히 write 하나로 끝날 코드가 복잡해진다는 단점이 있지만, 충분히 상황에 따라 고려해볼만 한 방식이라고 생각한다.