#include #include #include #include #include #include #include #include #include int main () { int sockfd; unsigned int len; struct sockaddr_in address; int result; char filename[256], fncount, *filecontent; // 파일이름, 파일이름길이, 파일내용 long filesize; // 파일크기 FILE *fp; // 파일핸들 char isexist[6] = ""; // 파일이 서버에 존재하는지 정보를 담을 문자열 sockfd = socket (AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr ("127.0.0.1"); address.sin_port = 9734; len = sizeof (address); result = connect (sockfd, (struct sockaddr *)&address, len); if (result == -1) { perror ("oops: client5"); exit (1); } while (1) { memset (filename, 0, 256); // 파일이름배열을 깨끗이 청소한뒤 gets (filename); // 키보드입력로부터 파일이름을 받아옵니다. fncount = strlen (filename); // 파일이름의 길이를 구해서 write (sockfd, &fncount, 1); // 소켓으로 파일이름길이를 먼저 전송하고, write (sockfd, filename, fncount); // 파일이름을 보내줍니다. if (strncmp (filename, "#quit", fncount) == 0) break; // 만약 파일이름이 #quit이면 루프를 나가 소켓을 닫고 종료합니다. read (sockfd, isexist, 6); // 서버에서 보내온 파일이 존재하는가의 정보를 읽습니다. (영문 대문자 5자) if (strcmp (isexist, "EXIST") == 0) { // 만일 원격에 파일이 존재 (EXIST)하면 read (sockfd, &filesize, sizeof(long)); // 파일크기를 받아와서 filecontent = malloc (filesize); // 그만큼 메모리를 할당한뒤 read (sockfd, filecontent, filesize); // 파일내용도 마저 받아옵니다. fp = fopen (filename, "w"); // 로컬에 파일을 생성하고, 내용을 써넣고, 닫습니다. fwrite (filecontent, 1, filesize, fp); fclose (fp); free(filecontent); // 메모리 할당을 제거하고.. printf ("file transfer complete.\n"); // 전송이 완료되었음을 표시합니다. } else { // 원격에 파일이 존재하지 않으면 printf ("file does not exist.\n"); // 에러를 출력합니다. } } // 사용자에게서 #quit 문자열을 받을때까지 계속 루프를 돕니다. close (sockfd); // 소켓을 닫습니다. exit (0); }