📄 client.c
字号:
if(chdir(dir)<0) printf("invalid dir\n"); else printf("lcd seccessed! local dir=%s\n",dir); }}void help(){ printf("\033[1;40;34m%s\033[0m","help --List the commmand infomation.\n"); printf("\033[1;40;34m%s\033[0m","cd --Change remote working directory.\n"); printf("\033[1;40;34m%s\033[0m","lcd --Change local working directory.\n"); printf("\033[1;40;34m%s\033[0m","ls --List contents of remote directory.\n"); printf("\033[1;40;34m%s\033[0m","pwd --Print working directory on remote machine.\n"); printf("\033[1;40;34m%s\033[0m","lpwd --Print working directory on local machine.\n"); printf("\033[1;40;34m%s\033[0m","bye --Terminate ftp session and exit.\n"); printf("\033[1;40;34m%s\033[0m","mode --Change the mode.\n"); printf("\033[1;40;34m%s\033[0m","get --Receive file.\n"); printf("\033[1;40;34m%s\033[0m","put --Send one file.\n"); printf("\033[1;40;34m%s\033[0m","! --Execute a local command.\n"); puts ("");}void ftp_cmd_filename(char * usr_cmd, char * src_file, char * dst_file){ int length, flag = 0; int i = 0, j = 0; char * cmd_src; cmd_src = strchr(usr_cmd, ' '); if(cmd_src == NULL) { printf("command error!\n"); return; } else { while(*cmd_src == ' ') cmd_src ++; } if(cmd_src == NULL || cmd_src == '\0') { printf("command error!\n"); } else { length = strlen(cmd_src); while(i <= length)//be careful with space in the filename { if((*(cmd_src+i)) !=' ' && (*(cmd_src+i)) != '\\') { if(flag == 0) src_file[j] = *(cmd_src +i); else dst_file[j] = *(cmd_src +i); j++; } if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) !=' ') { if(flag == 0) src_file[j] = *(cmd_src +i); else dst_file[j] = *(cmd_src +i); j++; } if((*(cmd_src+i)) == ' ' && (*(cmd_src+i-1)) != '\\') { src_file[j] = '\0'; flag = 1; j = 0; } if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) == ' ') { if(flag == 0) src_file[j] = ' '; else dst_file[j] = ' '; j++; } i++; }; } if(flag == 0) strcpy(dst_file, src_file); else dst_file[j] = '\0';}void ftp_cd(char *usr_cmd){ char *begin=strchr(usr_cmd,' '); char dir[1024]; if(begin==NULL) { puts("command error!"); return ; } else { while(*begin==' ') begin++; } if(begin==NULL||begin=='\0') { puts("command error!"); return ; } else { strncpy(dir,begin,strlen(begin)); dir[strlen(begin)]='\0'; ftp_send_cmd("CWD ",dir,sock_control); ftp_get_reply(sock_control); }}void user_mode(){ mode=(mode+1)%2; if(mode==1) puts("Now in PASV mode"); else puts("Now in PORT mode"); return ;}ftp_get(char*usr_cmd){ int get_sock, set, new_sock, i = 0; char src_file[512]; char dst_file[512]; char rcv_buf[512]; char cover_flag[3]; struct stat file_info; int local_file; int count = 0; ftp_cmd_filename(usr_cmd, src_file, dst_file); if(!stat(dst_file, &file_info)) { printf("local file %s exists: %d bytes\n", dst_file, (int)file_info.st_size); printf("Do you want to cover it? [y/n]"); fgets(cover_flag, sizeof(cover_flag), stdin); fflush(stdin); if(cover_flag[0] != 'y') { printf("get file %s aborted.\n", src_file); return; } } local_file = open(dst_file, O_CREAT|O_TRUNC|O_WRONLY); if(local_file < 0) { printf("creat local file %s error!\n", dst_file); return; } get_sock = xconnect_ftpdata(); if(get_sock < 0) { printf("socket error!\n"); return; } set = sizeof(local_host); ftp_send_cmd("TYPE I", NULL, sock_control); ftp_get_reply(sock_control); ftp_send_cmd("RETR ", src_file, sock_control); if(!mode) { while(i < 3) { new_sock = accept(get_sock, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { printf("accept return:%s errno: %d\n", strerror(errno),errno); i++; continue; } else break; } if(new_sock == -1) { printf("Sorry, you can't use PORT mode. \n"); return; } ftp_get_reply(sock_control); while(1) { printf("read data from data socket\n"); count = read(new_sock, rcv_buf, sizeof(rcv_buf)); if(count <= 0) break; else { write(local_file, rcv_buf, count); } } close(local_file); close(get_sock); close(new_sock); ftp_get_reply(sock_control); } else { ftp_get_reply(sock_control); while(1) { count = read(get_sock, rcv_buf, sizeof(rcv_buf)); if(count <= 0) break; else { write(local_file, rcv_buf, count); } } close(local_file); close(get_sock); ftp_get_reply(sock_control); } ftp_get_reply(sock_control); }void ftp_put(char*usr_cmd){ char src_file[512],dst_file[512]; char send_buff[512]; struct stat file_info; int local_file; int file_put_sock,new_sock,count=0,i=0; int set=sizeof(local_host); ftp_cmd_filename(usr_cmd,src_file,dst_file); if(stat(src_file,&file_info)<0) { printf("local file %s doesn't exist!\n",src_file); return; } local_file=open(src_file,O_RDONLY); if(local_file<0) { puts("Open file error"); return ; } file_put_sock=xconnect_ftpdata(); if(file_put_sock<0) { ftp_get_reply(sock_control); puts("Creat data socket error"); return; } ftp_send_cmd("STOR ",dst_file,sock_control); ftp_get_reply(sock_control); ftp_send_cmd("TYPE I",NULL,sock_control); ftp_get_reply(sock_control); if(mode==0) { while(i<3) { new_sock=accept(file_put_sock,(struct sockaddr *)&local_host,(socklen_t*)&set); if(new_sock==-1) { puts("error create new_sock in put port"); i++; continue ; } else break; } if(new_sock==-1) { puts("The PORT mode won't work"); return; } while(1) { count=read(local_file,send_buff,sizeof(send_buff)); if(count<=0) break; else { write(new_sock,send_buff,sizeof(send_buff)); } close(local_file); close(file_put_sock); close(new_sock); } } if(mode==1) { while(1) { count=read(local_file,send_buff,sizeof(send_buff)); if(count<=0) break; else { write(file_put_sock,send_buff,count); } } close(local_file); close(file_put_sock); } ftp_get_reply(sock_control);}void local_ls(char *usr_cmd){ char *temp =strchr(usr_cmd,'!'); system(temp+1); return ;}int run(char * server_ip,int port){ int error; int cmd_flag; char user_cmd[1024]; error=fill_host_addr(server_ip,&ftp_server,port); if(error==254) cmd_err_exit("Invalid port!",254); if(error==253) cmd_err_exit("Invalid address!",253); sock_control=xconnect(&ftp_server,1); //建立控制通道 if((error=ftp_get_reply(sock_control))!=220)//对新用户准备好 cmd_err_exit("Connect error!",220); error=ftp_login(); while (error!=1)//登录 { error=ftp_login(); } while(1) //用户交互开始 { printf("ftp> "); fgets(user_cmd,510,stdin); fflush(stdin);//清除输入缓冲区 if(user_cmd[0]=='\n') continue; user_cmd[strlen(user_cmd)-1]='\0'; cmd_flag=ftp_usr_cmd(user_cmd); switch (cmd_flag) { case 1: ftp_list(); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 2: ftp_pwd(); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 3: ftp_cd(user_cmd); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 4: ftp_put(user_cmd); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 5: ftp_get(user_cmd); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 6: ftp_bye(); memset(user_cmd,'\0',sizeof(user_cmd)); exit(0); break; case 7: user_mode(); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 8: local_ls(user_cmd); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 12: local_pwd(); memset(user_cmd,'\0',sizeof(user_cmd)); break; case 13: local_cd(user_cmd); memset(user_cmd,'\0',sizeof(user_cmd)); break; default: help(); memset(user_cmd,'\0',sizeof(user_cmd)); break; } }}int main(int argc,char *argv[]){ //fill_host_addr(argv[1],&ftp_server,(int)atoi(argv[2])); //get_user(); //get_pass(); //xconnect(&ftp_server,1); if(argc!=2&&argc!=3) { printf("Usage:%s [host[port]]",argv[0]); exit(1); } else { if(argv[2]==NULL) run(argv[1],21); else run(argv[1],atoi(argv[2])); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -