📄 function.c
字号:
#include "function.h"#include "my_client.h"#include "cmd.h"//-------------------------------------------------------------------------------------------------void run(){ while(1) { //print_title(); // 输出ftp> 等待用户输入 printf("ftp>"); fflush(stdin); fgets(cmd_buf, CMD_BUFFER_SIZE, stdin); fflush(stdin); //清除输入缓冲区 if(cmd_buf[0]=='\n') continue; cmd_buf[strlen(cmd_buf)-1]='\n'; cmd_flag=intpr_cmd(cmd_buf); switch(cmd_flag) { case QUIT: cmd_quit(); return; case LS: cmd_ls(LS); break; case CD: cmd_cd(); break; case GET: cmd_get(); break; case MGET: cmd_mget(); break; case PUT: cmd_put(); break; case MPUT: cmd_mput(); break; case HELP: cmd_help(); break; case PASSIVE: passive=(passive+1)%2; if(passive==1) printf("Passive mode on.\n"); else printf("Passive mode off.\n"); break; case USER: cmd_user(); break; case LCD: cmd_lcd(); break; case MKDIR: cmd_mkdir(); break; case RENAME: cmd_rename(); break; case RMDIR: cmd_rmdir(); break; case DELETE: cmd_delete(); break; case MIRROR: cmd_mirror(); break; case OPEN: cmd_uopen(); break; case CLOSE: cmd_close(); break; case LPWD: cmd_lpwd(); break; case LMKDIR: cmd_lmkdir(); break; case LRMDIR: cmd_lrmdir(); break; case LDIR: cmd_ldir(); break; case PWD: cmd_pwd(); break; default: printf("?Invalid command!\n"); break; } }}//-------------------------------------------------------------------------------------------------int intpr_cmd(char *cmd){ int flag; if(strncmp(cmd,"quit",4)==0) flag=QUIT;/* else if(strncmp(cmd,"!",1)==0) flag=SHELL; else if(strncmp(cmd,"$",1)==0) flag=MACRO; else if(strncmp(cmd,"account",7)==0) flag=ACCT; else if(strncmp(cmd,"append",6)==0) flag=APP;*/ else if(strncmp(cmd,"ls",2)==0) flag=LS; else if(strncmp(cmd,"cd",2)==0) flag=CD; else if(strncmp(cmd,"get",3)==0) flag=GET; else if(strncmp(cmd,"mget",4)==0) flag=MGET; else if(strncmp(cmd,"put",3)==0) flag=PUT; else if(strncmp(cmd,"mput",4)==0) flag=MPUT; else if(strncmp(cmd,"help",4)==0 || strncmp(cmd,"?", 1)==0) flag=HELP; else if(strncmp(cmd,"passive",7)==0) flag=PASSIVE; else if(strncmp(cmd,"user",4)==0) flag=USER; else if(strncmp(cmd,"lcd",3)==0) flag=LCD;/* else if(strncmp(cmd,"nlist",5)==0) flag=NLIST;*/ else if(strncmp(cmd,"mkdir",5)==0) flag=MKDIR; else if(strncmp(cmd,"rename",6)==0) flag=RENAME; else if(strncmp(cmd,"rmdir",5)==0) flag=RMDIR; else if(strncmp(cmd,"delete",6)==0) flag=DELETE; else if(strncmp(cmd,"mirror",6)==0) flag=MIRROR; else if(strncmp(cmd,"open",4)==0) flag=OPEN; else if(strncmp(cmd,"close",5)==0) flag=CLOSE; else if(strncmp(cmd,"bye",3)==0) flag=QUIT; else if(strncmp(cmd,"lpwd",4)==0) flag=LPWD; else if(strncmp(cmd,"lmkdir",6)==0) flag=LMKDIR; else if(strncmp(cmd,"lrmdir",6)==0) flag=LRMDIR; else if(strncmp(cmd,"ldir",4)==0) flag=LDIR; else if(strncmp(cmd,"pwd",3)==0) flag=PWD; return flag;}//-------------------------------------------------------------------------------------------------int cmd_open(char* addr, char* port) //connect连接到指定服务器的指定端口上 然后登录{ client_sockfd=socket(AF_INET, SOCK_STREAM, 0); if(client_sockfd<0) { // 创建socket出错。 printf("Create client socket failed!\n"); exit(1); } if((get_serv_addr(addr,atoi(port),&server_addr))<0) return -1; if(ftp_connect(client_sockfd,&server_addr,addr)==-1) return -1; isconnect=1; cmd_user(); return 0;}//-------------------------------------------------------------------------------------------------int get_serv_addr(char *addr, int port, struct sockaddr_in *pserver_addr) //获得服务器的地址{ if(port<=0||port>=(1<<16)) { printf("port should be between 1 and 255.\n"); return -1; } bzero(pserver_addr,sizeof(struct sockaddr_in));//填充为0 pserver_addr->sin_family=AF_INET; pserver_addr->sin_port=htons(port); if(inet_addr(addr)!=-1) pserver_addr->sin_addr.s_addr=inet_addr(addr); else { if((server_hostent=gethostbyname(addr))!=0) { memcpy(&pserver_addr->sin_addr,server_hostent->h_addr,sizeof(pserver_addr->sin_addr)); } else { printf("Unknown host\n"); return -1; } } return 0;}//-------------------------------------------------------------------------------------------------int ftp_connect(int client_sockfd, struct sockaddr_in *pserver_addr, char *addr) //连接到指定服务器的指定端口{ socklen_t server_addr_length = sizeof(server_addr); if(connect(client_sockfd,(struct sockaddr*)pserver_addr, server_addr_length) < 0) { //输出连接服务器出错 printf("Cannot connect to %s.\n", addr); return -1; } else printf("Connected to %s.\n", addr); //连上去了,等待接受服务器返回的消息 if(get_reply(client_sockfd)!=220) { //连接错误 printf("Visit refused.\n"); return -1; } return 0;}//-------------------------------------------------------------------------------------------------int get_reply(int sockfd) //接收sockfd中的返回消息,放在reply_buffer中,并输出,返回响应代码{ int i=0, flag=0, lastline=0; char c_reply_code[4]; reply_length=read(sockfd, reply_buf, REPLY_BUFFER_SIZE-2); if(reply_length>0) { reply_code=atoi(reply_buf); c_reply_code[0]=reply_buf[0]; c_reply_code[1]=reply_buf[1]; c_reply_code[2]=reply_buf[2]; } else { isconnect=0; islogin=0; printf("Service no available, remote server has closed connection.\n"); return 0; } reply_buf[reply_length]='\0'; while(1) { flag=0; printf("%s", reply_buf); //判断是否结束,结束则把flag置为1 for(i=0;i<reply_length;i++) { if(lastline==5 && reply_buf[i]=='\n') { lastline=6; //printf("lastline=6\n"); flag=1; break; } if(lastline==4 && reply_buf[i]=='\r') { lastline=5; //printf("lastline=5\n"); } if(lastline==3) { if(reply_buf[i]==' ') { lastline=4; //printf("lastline=4\n"); } else lastline=0; } if(lastline==2) { if(reply_buf[i]==c_reply_code[2]) { lastline=3; //printf("lastline=3\n"); } else lastline=0; } if(lastline==1) { if(reply_buf[i]==c_reply_code[1]) { lastline=2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -