Linux c network programming) I cannot Connect to 2nd socket -


to send simple message working correctly in program.

but has problem when send file.

there socket has different port.

i made socket.

but after binding, when listen method called in server,

it halt.

and client occurs connect error.

please let me know how can fix it.

server.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/_default_fcntl.h> #include <sys/reent.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/unistd.h> #include <dirent.h> #include <sys/types.h> #include <string.h> #include <grp.h> #include <dirent.h> #include <pwd.h>      void error_handling(char *message);     void inst_list();     void inst_pwd();     void inst_cwd(char *target);     void inst_nlst();     void inst_dele();     void inst_mkd(char *target);     void inst_handling();     void inst_rmd(char *target);     void inst_retr(char *target);      char sendmsg[500] = "";     char workingpath[500]="/";     char homepath[500]="../../usr/ftp";      struct sockaddr_in clnt_adr;     int clnt_sock;     int main(int argc, char *argv[])     {         int serv_sock, data_sock, clnt_datasock;         char message[buf_size];         int str_len, i;         char dataport[] = "13000";         char welcomemsg[30] = "hello dataport: ";         char dataconnectmsg[30] = "data connected!";         char method[10] = "";         char target[100] = "";             struct sockaddr_in serv_adr;         struct sockaddr_in data_adr;         struct sockaddr_in datcl_adr;           socklen_t clnt_adr_sz;//         socklen_t datcl_adr_sz;//          if(argc!=2) {             printf("usage : %s <port>\n", argv[0]);             exit(1);         }          serv_sock=socket(pf_inet, sock_stream, 0);         data_sock = socket(pf_inet, sock_stream,0);          if(serv_sock==-1)             error_handling("socket() error");          if(data_sock == -1)             error_handling("data socket() error");           memset(&serv_adr, 0, sizeof(serv_adr));         memset(&data_adr, 0, sizeof(data_adr));          serv_adr.sin_family=af_inet;         serv_adr.sin_addr.s_addr=htonl(inaddr_any);         serv_adr.sin_port=htons(atoi(argv[1]));           data_adr.sin_family = af_inet;         data_adr.sin_addr.s_addr=htonl(inaddr_any);         data_adr.sin_port=htons(13230);          if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)             error_handling("bind() error");          //  if(bind(data_sock, (struct sockaddr*)&data_adr, sizeof(data_adr))==-1)         //      error_handling("data bind() error");          if(listen(serv_sock, 5)==-1)             error_handling("listen() error");          //  if(listen(data_sock, 5)==-1)         //      error_handling("listen() error");          clnt_adr_sz=sizeof(clnt_adr);         //  datcl_adr_sz=sizeof(datcl_adr);          for(i=0; i<5; i++)         {             clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);             if(clnt_sock==-1)                 error_handling("accept() error");             else                 printf("connected client %d \n", i+1);              strcat(welcomemsg , dataport);             write(clnt_sock, welcomemsg, strlen(welcomemsg));              while((str_len=read(clnt_sock, message, buf_size))!=0)             {                 message[str_len] = 0;                  sscanf(message, "%s %s",method, target);                  if(strcmp(method, "quit") == 0)                 {                     strcat(sendmsg, "disconnected");                     write(clnt_sock, sendmsg, strlen(sendmsg));                     close(clnt_sock);                 }                  inst_handling(method, target);                  write(clnt_sock, sendmsg, strlen(sendmsg));                  memset(method, 0 , sizeof(char)*10);                 memset(target, 0 , sizeof(char)*100);                 memset(sendmsg, 0, sizeof(char)*500);             }         }          close(serv_sock);         return 0;     }      void inst_handling(char *method, char *target)     {         char cpymessage[2048] = "";         char *token;         char protocol[100];         char host[200];           if(strcmp(method,"pwd") == 0)//작업 디렉토리 표시             inst_pwd();         else if(strcmp(method, "cwd") == 0)//작업 디렉토리 변경             inst_cwd(target);         else if(strcmp(method, "list") == 0)//원격지 파일 목록 보기             inst_list();         else if(strcmp(method, "nlst") == 0)///원격지 디렉토리 목록 보기             inst_nlst();         //  else if(strcmp(method, "stor") == 0)//원격지에 파일 저장         //      inst_put(target,body);         else if(strcmp(method, "retr") == 0)//원격지 파일 가져오기             inst_retr(target);         else if(strcmp(method, "dele") == 0)//원격지 파일 삭제             inst_dele(target);         else if(strcmp(method, "mkd") == 0)//원격지 디렉토리 생성             inst_mkd(target);         else if(strcmp(method, "rmd") == 0)//원격지 디렉토리 제거             inst_rmd(target);          else         {             fputs("\n\n nowhere", stderr);             fputc('\n', stderr);             strcat(sendmsg, "wrong message");         }     }      void inst_pwd()     {         strcat(sendmsg,"working directory : ");         strcat(sendmsg, workingpath);         return;     }      void inst_cwd(char *target)     {         char fullpath[500] = "";         strcat(fullpath, homepath);         strcat(fullpath, target);         dir *dir_ptr;          if ( ( dir_ptr = opendir( fullpath ) ) == null )         {             strcat(sendmsg, "please enter correct path");             return;         }          memset(workingpath, 0 , sizeof(char)*500);         strcat(workingpath, target);         strcat(sendmsg, workingpath);         return;     }      void inst_list()     {         char filelist[200] = "";         char fullpath[500] = "";         strcat(fullpath, homepath);         strcat(fullpath, workingpath);          dir *dir_ptr;         struct dirent *direntp; /* each entry */         struct stat info;          if ( ( dir_ptr = opendir( fullpath ) ) == null )             printf("ls1: cannot open %s\n", fullpath);         else         {             while ( ( direntp = readdir( dir_ptr ) ) != null )             {                 if( stat(fullpath, &info) != -1 )                 {                     if(direntp->d_type != dt_dir)                     {                         strcat(filelist, direntp->d_name);                         strcat(filelist, "\n");                     }                 }             }             closedir(dir_ptr);         }          strcat(sendmsg,"file list : \n");         strcat(sendmsg,filelist);         return;      }      void inst_nlst()     {         char filelist[200] = "";         char fullpath[500] = "";         strcat(fullpath, homepath);         strcat(fullpath, workingpath);          dir *dir_ptr;         struct dirent *direntp; /* each entry */         struct stat info;          if ( ( dir_ptr = opendir( fullpath ) ) == null )             printf("ls1: cannot open %s\n", fullpath);         else         {             while ( ( direntp = readdir( dir_ptr ) ) != null )             {                 if( stat(fullpath, &info) != -1 )                 {                     if(direntp->d_type == dt_dir)                     {                         strcat(filelist, direntp->d_name);                         strcat(filelist, "\n");                     }                 }             }             closedir(dir_ptr);         }          strcat(sendmsg,"directory list : \n");         strcat(sendmsg,filelist);         return;      }      void inst_dele(char *target)     {         char inst[1024] = "";         char path[1024] = "";          file *file = null;         mode_t file_mode;         struct stat file_info;          strcat(path, homepath);         strcat(path, target);          if(stat(path,&file_info) == -1)         {             strcat(sendmsg, "no such file\n");             return;         }          file_mode = file_info.st_mode;         if (s_isdir(file_mode))         {//디렉토리 파일인 경우             strcat(sendmsg, "error: target directory\n");             return;         }         else if (s_isreg(file_mode))         {//일반 파일인 경우             strcat(inst, "rm ");             strcat(inst, path);             if( system(inst) != -1 )                 strcat(sendmsg, "the file removed");             else                 strcat(sendmsg, "fail remove file\n");             return;         }     }      void inst_rmd(char *target)     {         char inst[1024] = "";         char path[1024] = "";          file *file = null;         mode_t file_mode;         struct stat file_info;          strcat(path, homepath);         strcat(path, target);          if(stat(path,&file_info) == -1)         {             strcat(sendmsg, "no such file\n");             return;         }          file_mode = file_info.st_mode;         if (s_isdir(file_mode))//디렉토리 파일인 경우         {             int n=0;             struct dirent* d;             dir* dir = opendir(path);             while((d = readdir(dir))!=null) n++;              if(n>2)             {                 strcat(sendmsg, "the directory not empty\n");                 return;             }             closedir(dir);              strcat(inst, "rmdir ");             strcat(inst, path);             if( system(inst) != -1 )                 strcat(sendmsg, "the directory removed");             else                 strcat(sendmsg, "fail remove directory\n");             return;         }         else if (s_isreg(file_mode))         {//일반 파일인 경우             strcat(sendmsg, "error: target file\n");             return;         }      }      void inst_mkd(char *target)     {         char path[100] = "";         char inst[200] = "";          strcat(path, homepath);         strcat(path, target);//home path와 사용자가 입력한 path를 더해준다          strcat(inst, "mkdir -p ");//중간 폴더까지 모두 생성하도록 -p 옵션 사용         strcat(inst, path);          if(system(inst) != -1)         {             strcat(sendmsg, "the directory created");         }         return;     }      void inst_retr(char *target)     {         int read_cnt;         char buf[buf_size];         file * fp;         fp=fopen("../../usr/ftp/test.c", "rb");         while(1)         {             read_cnt=fread((void*)buf, 1, buf_size, fp);             if(read_cnt<buf_size)             {                 write(clnt_sock, buf, read_cnt);                 break;             }             write(clnt_sock, buf, buf_size);         }         puts("fin file data");         fclose(fp);         strcat(sendmsg,"end");     }        //int inst_delete(char *target)     //{     //  char inst[1024] = "";     //  char path[1024] = "../../usr/http";     //  file *file = null;     //  mode_t file_mode;     //  struct stat file_info;     //     //  strcat(path, target);     //     //  if(stat(path,&file_info) == -1)     //  {     //      strcat(sendmessage, "http/1.1 404 not found\n");     //      return 0;     //  }     //     //  file_mode = file_info.st_mode;     //  if (s_isdir(file_mode))     //  {//디렉토리 파일인 경우     //      strcat(inst, "rm -rf ");     //      strcat(inst, path);     //      system(inst);     //      strcat(sendmessage, "http/1.1 200 ok\n");     //      return 0;     //  }     //  else if (s_isreg(file_mode))     //  {//일반 파일인 경우     //      strcat(inst, "rm -f ");     //      strcat(inst, "/usr/http");     //      strcat(inst, path);     //      system(inst);     //      strcat(sendmessage, "http/1.1 200 ok\n");     //      return 0;     //  }     //}      void error_handling(char *message)     {         fputs(message, stderr);         fputc('\n', stderr);         exit(1);     } 

module file transfer

void inst_retr(char *target) {   data_sock = socket(pf_inet, sock_stream,0);  if(data_sock == -1)     error_handling("data socket() error");  memset(&data_adr, 0, sizeof(data_adr)); data_adr.sin_family = af_inet; data_adr.sin_addr.s_addr=htonl(inaddr_any); data_adr.sin_port=htons(12501);  if(bind(data_sock, (struct sockaddr*)&data_adr, sizeof(data_adr))==-1)     error_handling("data bind() error"); else     error_handling("bind ok");  if(listen(data_sock, 5)==-1)     error_handling("listen() error");  datcl_adr_sz=sizeof(datcl_adr);  clnt_sock=accept(data_sock, (struct sockaddr*)&datcl_adr, &datcl_adr_sz); if(clnt_sock==-1)     error_handling("accept() error"); else     printf("connected data client  \n");  int read_cnt; char buf[buf_size]; char eof = eof; file * fp; fp=fopen("../../usr/ftp/test.c", "rb"); while(1) {     read_cnt=fread((void*)buf, 1, buf_size, fp);     if(read_cnt<buf_size)     {         write(clnt_sock, buf, read_cnt);         break;     }     write(clnt_sock, buf, buf_size);     puts("file data"); } shutdown(clnt_sock, shut_wr); puts("fin file data"); fclose(fp); strcat(sendmsg,"end"); 

}

client.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>  #define buf_size 1024 void error_handling(char *message); void inst_retr(); int sock; int main(int argc, char *argv[]) {     int datasock;      char message[buf_size];     char tmp[buf_size];     char datamsg[buf_size];     char method[buf_size];     char target[buf_size];     int str_len;     struct sockaddr_in serv_adr, data_adr;      if(argc!=3) {         printf("usage : %s <ip> <port>\n", argv[0]);         exit(1);     }      sock=socket(pf_inet, sock_stream, 0);     datasock=socket(pf_inet, sock_stream, 0);       if(sock==-1)         error_handling("socket() error");     if(datasock==-1)         error_handling("data socket() error");      memset(&serv_adr, 0, sizeof(serv_adr));     memset(&data_adr, 0, sizeof(serv_adr));       serv_adr.sin_family=af_inet;     serv_adr.sin_addr.s_addr=inet_addr(argv[1]);     serv_adr.sin_port=htons(atoi(argv[2]));         if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)         error_handling("connect() error!");     else         puts("connected...........");      //  data_adr.sin_family=af_inet;     //  data_adr.sin_addr.s_addr=htons(atoi(argv[1]));     //  data_adr.sin_port=htons(13230);     //     //  if(connect(datasock, (struct sockaddr*)&data_adr, sizeof(data_adr)) == -1)     //      error_handling("data connect() error!");     //  else     //      puts("connected.....data...");        str_len=read(sock, message, buf_size-1);     message[str_len]=0;      printf("%s\n", message);      while(1)     {         fputs("input message(q quit): ", stdout);         fgets(message, buf_size, stdin);         message[strlen(message)-1] = 0;          if(strcmp(message,"quit") == 0)             break;          strcpy(tmp,message);         sscanf(tmp, "%s %s",method, target);         if(strcmp(method, "retr") == 0)         {             write(sock, message, strlen(message));             inst_retr();             str_len=read(sock, message, buf_size-1);             message[str_len]=0;             printf("message server: %s\n", message);             memset(message, 0, sizeof(char)*buf_size);             memset(method, 0, sizeof(char)*buf_size);             memset(target, 0, sizeof(char)*buf_size);             continue;         }            //      if(strcmp(message,"data") == 0)         //      {         //          write(sock, message, strlen(message));         //         //         //          str_len=read(datasock, message, buf_size-1);         //          message[str_len]=0;         //          printf("message server: %s", message);         //         //         //      }         write(sock, message, strlen(message));         str_len=read(sock, message, buf_size-1);         message[str_len]=0;         printf("message server: %s\n", message);         memset(message, 0, sizeof(char)*buf_size);         memset(method, 0, sizeof(char)*buf_size);         memset(target, 0, sizeof(char)*buf_size);     }      close(sock);     return 0; }  void inst_retr() {     char buf[buf_size];     int read_cnt;     file *fp;     fp=fopen("../../usr/ftp/receive.dat", "wb");      while((read_cnt=read(sock, buf, buf_size ))!=0)             fwrite((void*)buf, 1, read_cnt, fp);     puts("received file data");      fclose(fp);     return; }    void error_handling(char *message) {     fputs(message, stderr);     fputc('\n', stderr);     exit(1); } 

module file recieving

void inst_retr() { datasock=socket(pf_inet, sock_stream, 0); if(datasock==-1)     error_handling("data socket() error");  if(connect(datasock, (struct sockaddr*)&data_adr, sizeof(data_adr)) == -1)     error_handling("data connect() error!"); else     puts("connected.....data...");  char buf[buf_size]; int read_cnt; file *fp; fp=fopen("../../usr/ftp/receive.dat", "wb");  while((read_cnt=read(sock, buf, buf_size ))!=0)     fwrite((void*)buf, 1, read_cnt, fp); puts("received file data"); fclose(fp); return; } 


Comments

Popular posts from this blog

node.js - Using Node without global install -

How to access a php class file from PHPFox framework into javascript code written in simple HTML file? -

java - Null response to php query in android, even though php works properly -