서버 실행환경 |
|
|
학과 서버 사용 |
OS |
SunOS 5.10 |
GCC |
3.4.6 |
Java |
1.5.0_16 |
클라이언트 실행환경 | |
Desktop | 조립식 |
CPU | Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz |
Memory | 8.00 GB |
OS | Windows 7 Professional K 64bit |
Java | 1.8.0_05 |
MySQL | Ver 14.14 Distrib 5.6.19, for Win64 |
Web Server | Apache Tomcat 7.0.51 |
서버 프로그램
#include <sys/socket.h> #include <sys/stat.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #define PORT 5555 #define MAXBUF 1024 /* 클라이언트와 길이를 맞추어준다. */ int main(int argc, char **argv) { int server_sockfd, client_sockfd; // 소켓 int client_len, n; int file_read_len; char buf[MAXBUF]; char file_name[MAXBUF]; struct sockaddr_in clientaddr, serveraddr; int source_fd; // 파일 번호 int chk_bind; // 연결 확인 변수 int chk_write; int read_len; client_len = sizeof(clientaddr); /* socket() */ server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(server_sockfd == -1) { perror("socket error : "); exit(0); } /* bind() */ bzero(&serveraddr, sizeof(serveraddr)); // 해당 메모리 영역 초기화 serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(PORT); chk_bind = bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if(chk_bind > 0) { perror("bind error : "); exit(0); } /* listen() */ if(listen(server_sockfd, 5)) { perror("listen error : "); } /* 클라이언트 연결 대기 */ while(1) { memset(buf, 0x00, MAXBUF); /* accept() */ client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len); printf("New Client Connect: %s\n", inet_ntoa(clientaddr.sin_addr)); /* 파일명 받기 */ read_len = read(client_sockfd, buf, MAXBUF); if(read_len > 0) { memset(file_name, 0x00, MAXBUF); strcpy(file_name, buf); printf("%s > %s\n", inet_ntoa(clientaddr.sin_addr), file_name); } else { close(client_sockfd); break; } /* 파일 열기 */ source_fd = open(file_name, O_RDONLY); if(!source_fd) { perror("file open error : "); break ; } printf("before while\n"); while(1) { memset(buf, 0x00, MAXBUF); file_read_len = read(source_fd, buf, MAXBUF); printf("\nread : %s",buf); chk_write = write(client_sockfd, buf, MAXBUF); if(file_read_len == EOF | file_read_len == 0) { printf("finish file\n"); break; } } close(client_sockfd); close(source_fd); } close(server_sockfd); return 0; }
클라이언트 프로그램
#include <WinSock2.h> #include <stdio.h> #include <stdlib.h> #include <io.h> // _open(), _read() 사용하기 위해서 #include <fcntl.h> // O_CREATIO, _O_RDONLY 사용하기 위해 #include <sys/types.h> #include <errno.h> #include <sys/stat.h> // _S_IWRITE 사용하기 위해 #define PORT 5555 #define IP "127.0.0.1" #define MAXBUF 1024 int main() { WSADATA WSAData; SOCKADDR_IN addr; SOCKET s; char buffer[1024]; char file_name[1024]; int readbytes; int i, len; int dest_fd; int recv_len; int totaln = 0; if (WSAStartup (MAKEWORD(2,2), &WSAData) != 0) { return 1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { return 1; } addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.S_un.S_addr = inet_addr(IP); if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) { printf("fail to connect\n"); closesocket(s); return 1; } printf("전송받을 파일명 : "); scanf("%s", file_name); printf("입력한 파일명 : %s", file_name); len = strlen(file_name); send(s, file_name, len, 0); // 파일 생성 dest_fd = _open(file_name, _O_CREAT | _O_EXCL | _O_WRONLY,_S_IWRITE); if(!dest_fd) { perror("Error "); return 1; } if(errno == EEXIST) { perror("Error "); _close(dest_fd); return 1; } printf("파일 생성 완료\n"); while(1) { memset(buffer, 0x00, MAXBUF); recv_len = recv(s, buffer, MAXBUF, 0); if(recv_len == 0) { printf("finish file\n"); break; } totaln += _write(dest_fd, buffer, recv_len); } _close(dest_fd); closesocket(s); WSACleanup(); //system("pause"); return 0; }
'대학 생활 > C' 카테고리의 다른 글
[C] HTTP client 예제 (0) | 2014.11.05 |
---|---|
[C] 소켓 파일 전송 프로그램 (클라이언트 > 서버) (0) | 2014.11.05 |
[C] 도메인 주소 변환 예제 (0) | 2014.10.29 |
[C] 문자, 숫자 변환 함수 (0) | 2014.10.22 |