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
Post a Comment