TCP/IP Socket Programming… 제 15장 소켓과 표준 입출력 데이터베이스 실험실 박사 2학기 장창복
서론 15장 소켓과 표준 입.출력 16장 입력과 출력 스트림의 완벽 분리 표준 입출력 함수를 이용한 호스트간의 데이터 전송 파일을 다룰 때 사용한 fopen, fclose, feof, fgetc 함수 이용 16장 입력과 출력 스트림의 완벽 분리 fopen 함수를 호출해서 파일을 열고 나면, 파일로부터 데이터를 송수신할 수 있음 스트림(stream)이 생성되었다고 표현 파일 디스크립터를 가지고 입력과 출력 스트림을 분리함
표준 입.출력 함수의 장점 이식성(Portability) 효율성 시스템 함수들의 이용 운영체제 종속적 모든 시스템이 지원해 주는 표준화된 함수 사용 ANSI 표준 c의 입출력 함수 효율성 표준 입출력 버퍼와 소켓 생성시 커널에서 제공하는 버퍼 존재 커널 버퍼 흐름 제어 목적(데이터 손실시 재전송) 표준 입출력 버퍼 성능 향상 목적 : 여러 데이터들을 하나의 패킷으로 전송함 전송시 필요한 헤더의 바이트를 줄임
표준 입.출력 함수의 장점 표준 입출력 함수를 통한 파일 생성의 예 File *fp fp = fopen(“test.dat”,”w”); if(fp == null) error_handling(“file open error”); fputs(“Network Programming\n\n”,fp); fclose(fp)
표준 입.출력 함수의 장점 리눅스에서 제공하는 시스템 함수를 이용한 파일 생성 예 int fildes; char str[] = “socket programming\n\n”; fildes = open(“data.daa”, O_WRONLY|O_CREAT|O_TRUNC); if(fildes == -1) error_handling(“file open error”); write(fildes, str, sizeof(str)-1); close(fildes)
표준 입.출력 함수의 장점 표준 입출력 함수 시스템 입출력 함수 소켓 생성 파일 포인터 이용 파일 디스크립터 FILE 구조체의 포인터 시스템 입출력 함수 파일 디스크립터 시스템 함수를 통해서 파일을 여는 경우에 리턴되는 정수 소켓 생성 파일 디스크립터 리턴 표준 입출력 함수를 사용하기 위해 파일 디스크립터를 가지고 파일 포인터를 만들어야만 함
표준 입출력 함수의 사용 파일 디스크립터를 이용하여 파일 포인터 생성하기 fdopen 함수 File Des Data.dat 파일 디스크립터를 이용하여 파일 포인터를 생성 FILE * fdopen(int fildes, const char * mode); fildes : 대상 파일을 가리키는 파일 디스크립터 mode : 파일 포인터 모드 읽기(r), 쓰기(w) File Des Data.dat fdopen 호출 FILE *
표준 입출력 함수의 사용 파일 디스크립터를 이용한 파일 포인터 생성 예제(exam3) File *fp fclose(fp) int fildes; File *fp fildes = open(“data.dat”, O_WRONLY|O_CREAT|O_TRUNC); if(fildes == -1) error_handling(“file open error”); fp=fdopen(fildes,”w”); fputs(“Network Programming\n\n”,fp); fclose(fp)
표준 입출력 함수의 사용 exam3 파일 실행 결과
표준 입출력 함수의 사용 파일 포인터를 이용하여 파일 디스크립터 얻기 fileno 함수 fileno 함수 사용 예(exam4) int fileno(FILE * stream); Stream : 파일 포인터 fileno 함수 사용 예(exam4) int fildes; File *fp fildes = open(“data.daa”, O_WRONLY|O_CREAT|O_TRUNC); if(fildes == -1) error_handling(“file open error”); printf(“First file descriptor : %d \n”, fildes); fp=fdopen(fildes,”w”); fputs(“TCP/IP Socket programming\n\n”,fp); printf(“Second file descriptor : %d \n\n”, fileno(fp)); fclose(fp)
표준 입출력 함수의 사용 exam4 파일 실행 결과
소켓 기반의 표준 입출력 함수의 사용 표준 입출력 함수를 사용하는 에코 서버(exam5) int serv_sock; int clnt_sock; FILE* readFP; FILE* writeFP; … serv_sock=socket(PF_INET, SOCK_STEAM,0); clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size); readFP=fdopen(clnt_sock,”r”); writeFP=fdopen(clnt_sock,”w”); while(!feof(readFP)) { fgets(message, BUFSIZE, readFP); fputs(message, writeFP); fflush(writeFP); } fclose(writeFP); fclose(readFP);
소켓 기반의 표준 입출력 함수의 사용 표준 입출력 함수를 사용하는 에코 클라이언트(exam6) int sock; FILE* readFP; FILE* writeFP; … sock=socket(PF_INET, SOCK_STEAM,0); readFP=fdopen(sock,”r”); writeFP=fdopen(sock,”w”); fputs(message, writeFP) fflush(writeFP); fgets(message, BUFSIZE, readFP); printf(“서버로부터 전송된 메시지: %s \n, message); fclose(writeFP); fclose(readFP);
소켓 기반의 표준 입출력 함수의 사용 exam5, exam6 파일 실행 예
Q & A