시스템 함수
표준 입출력
fopen으로 반환되는 포인터는 FILE이라 불리는 자료형이다
FILE* fp;
이식성
이 좋다
버퍼링
을 통한 성능 향상
에 도움이 된다
추가적 입출력 버퍼
를 제공받는다버퍼링을 하면 성능이 많이 좋아 지나??
데이터 양이 많을 수록 버퍼링에 따른 성능 차이는 크다!
ex
패킷을 보낼때는 헤더 정보가 추가되어 보내는 데이터 크기에 상관없이 일정한 크기를 가진다
그래서 전송해야 할 데이터 양에는 큰 차이가 나게된다
- 1 바이트 데이터를 10번에 걸쳐서 보내는 경우
1바이트 X 10회: 40 X 10 = 400바이트
- 1 바이트 데이터를 버퍼링해 10바이터로 묶어서 보내는 경우
10바이트 X 1회: 40 X 1 = 40바이트
보내야하는 데이터의 양이 10배나 차이가 난다
1바이트를 10회 이동 시키는 시간이 10바이트를 1번 이동시키는 것보다 10배 더 느리다
fflush()
호출이 빈번히 등장할 수 있다작업의 형태를 바꿀때마다 fflush()
를 호출해야함 fput -> fgetFILE 포인터로 변환
해야한다파일 디스크립터
를 반환 파일 디스크립터를 활용해 read, write를 통한 파일 복사보다
파일 포인터를 통해 fgets, fputs를 이용한 파일 복사가 훨씬 빠르다
파일의 크기가 커질수록 차이가 난다
소켓 생성 시에는 파일 디스크립터가 반환된다.
표준 입출력 함수를 사용하려면 이를 파일 포인터로 변환해야한다.
fdopen을 통하면 디스크립터 -> 파일 포인터로 변환 가능하다
FILE* fdopen(int fd,const char* mode)
fp = fdopen(fd,"w")
fileno를 사용하면 파일 포인터를 파일 디스크립터로 변환한다
int fileno(FILE* straem);
fileno(fp);
서버
소켓으로 부터 읽어오는 데이터가 없을때까지 통신을 하기 위해서
기존에는 소켓에서 읽어오는 데이터가 없을때까지 반복 조건을 뒀음
파일 포인터를 사용하면 비슷하게 !feof(포인터)를 사용하면 됨
fflush를 사용해야 바로 클라이언트에 데이터가 전송이 된다.
그렇지 않는다면 데이터를 모아서 보내기 때문에 바로 전송이 안된다
fflush없이 통신하면 오류남.... 안되더랑....
클라이언트에선 파일 포인터 변경 후 모드에 맞는 포인터를 사용하는 것만 주의하면 됨
태그가 어떤건 네트워크 프로그래밍이고 어떤건 네트워크프로그래밍이네요..
거슬리니 하나로 통일해주세요