tcp파일전송프로그래밍 질문

qwer2887의 이미지

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);  
}
chanik의 이미지

아래 페이지에 간단한 에코서버를 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.