tcp파일전송프로그래밍 질문
글쓴이: qwer2887 / 작성시간: 목, 2016/06/09 - 2:56오전
tcp기반 ftp서비스 프로그래밍한것인데 여기다가 select를 이용해서 서버가 다중작업을 하게끔하고싶은데..
어디서부터 어떻게 해야할지를모르겠어요..
클라이언트 ----------------------
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #define BUFSIZE 30 void error_handling(char *message); int main(int argc, char **argv) { int fd; int sd; char buf[BUFSIZE]; char cbuf[BUFSIZE]; int len; struct sockaddr_in serv_addr; if(argc!=3){ printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } /* 수신 한 데이터를 저장 할 파일 오픈 */ fd = open("receive.dat", O_WRONLY|O_CREAT|O_TRUNC); if(fd == -1) error_handling("File open error"); /* 서버 접속을 위한 소켓 생성 */ sd=socket(PF_INET, SOCK_STREAM, 0); if(sd == -1) error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=inet_addr(argv[1]); serv_addr.sin_port=htons(atoi(argv[2])); if( connect(sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1 ) error_handling("connect() error!"); /* 원하는 데이터를 입력 */ fgets(cbuf, 10, stdin); write(sd, cbuf, 5); /* 데이터를 전송 받아서 파일에 저장한다 */ while( (len=read(sd, buf, BUFSIZE )) != 0 ) { write(fd, buf, len); } /* 전송해 준것에 대한 감사의 메시지 전달 */ write(sd, "Thank you\n", 10); close(fd); close(sd); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
서버 -------
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #define BUFSIZE 30 void error_handling(char *message); int main(int argc, char **argv) { int serv_sd; int clnt_sd; int fd; char buf[BUFSIZE]; char cbuf[BUFSIZE]; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; int len; if(argc!=2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sd=socket(PF_INET, SOCK_STREAM, 0); if(serv_sd == -1) error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1])); if( bind(serv_sd, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) error_handling("bind() error"); if( listen(serv_sd, 5)==-1 ) error_handling("listen() error"); clnt_addr_size=sizeof(clnt_addr); clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_addr,&clnt_addr_size); if(clnt_sd==-1) error_handling("accept() error"); /* 문서의 이름 을 수신 합 */ len = read(clnt_sd, cbuf, BUFSIZE); write(1, cbuf, len); /* 접속해오는 클라이언트에게 전송해줄 파일 오픈 */ fd = open( cbuf, O_RDONLY ); if(fd == -1) error_handling("File open error"); /* 클라이언트에 데이터 전송 */ while( (len=read(fd, buf, BUFSIZE)) != 0 ) { write(clnt_sd, buf, len); } /* 데이터 전송후 소켓의 일부(전송영역)를 닫음 */ if( shutdown(clnt_sd, SHUT_WR) == -1 ) error_handling("shutdown error"); /* 인사의 메시지를 수신 함 */ len = read(clnt_sd, cbuf, BUFSIZE); write(1, cbuf, len); close(fd); close(clnt_sd); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
Forums:
아래 페이지에 간단한 에코서버를 select로
아래 페이지에 간단한 에코서버를 select로 다중화한 샘플이 나옵니다.
http://www.joinc.co.kr/w/Site/Network_Programing/Documents/select
자료의 목차는 아래와 같이 3개로 구성되어 있는데,
2, 3은 넘어가고 일단 1의 샘플만 참고하시면 작업에 충분할 것입니다.
1. 입출력 다중화를 이용한 다중연결처리 서버 제작
2. 모아서 처리하기
3. 비봉쇄 입출력 적용
올리신 코드에서 accept() 부터 close() 까지를 select loop으로 만들면 됩니다.
select() 자체가 낯설다면 아래 페이지가 도움이 될 것입니다.
http://www.joinc.co.kr/w/Site/system_programing/File/select
댓글 달기