서버 실행환경

 

 학과 서버 사용

 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;

}


+ Recent posts