📄 client.c
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/fcntl.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include <string.h>#include <arpa/inet.h>#define BUFF 1024void dispatch(char *cmd, int sockfd);int getSocket(char *address, int port){ int ret; register int socketfd; struct sockaddr_in sin; if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ fprintf(stderr, "fail to initial socket!\n"); exit(1); } sin.sin_family = AF_INET; sin.sin_port = htons(port); inet_pton(AF_INET, address, &sin.sin_addr); printf("Server address: %s\n",inet_ntoa(sin.sin_addr)); printf("Server port: %d\n",ntohs(sin.sin_port)); int len = sizeof(sin); if ((ret = connect(socketfd, (struct sockaddr *)&sin, len)) == -1){ fprintf(stderr, "can't connect server!\n"); exit(2); } return socketfd;}void contact(int sockfd){ char cmd[BUFF]; memset(cmd, 0, BUFF); while (1){ printf("ftp>:"); fgets(cmd,BUFF,stdin); dispatch(cmd, sockfd); }}char * isCdCmd(char *cmd){ char *temp = cmd; while (*temp == '\t' || *temp == ' ') temp++; if (*temp == 'c' && *(temp+1) == 'd'){ temp += 2; while (*temp == '\t' || *temp == ' ') temp++; } else{ return 0; } int i; if (*temp == '\n'){ printf("Usage: cd <subdirectory>\n"); return (void *)(-1); } for (i = 0; *(temp+i) != '\0'; i++){ if (*(temp+i) == ' ' || *(temp+i) == '\t'){ printf("Usage: cd <subdirectory>\n"); return (void *)(-1); } if (*(temp+i) == '\n') *(temp+i) = '\0'; } if (*temp == '.' && *(temp+1) == '.') return (void *)1; return temp;}char * isGetCmd(char *cmd){ char *temp = cmd; while (*temp == '\t' || *temp == ' ') temp++; if (*temp == 'g' && *(temp+1) == 'e' && *(temp+2) == 't'){ temp += 3; while (*temp == '\t' || *temp == ' ') temp++; } else{ return 0; } int i; if (*temp == '\n'){ printf("Usage: get <fileName>\n"); return (void *)(-1); } for (i = 0; *(temp+i) != '\0'; i++){ if (*(temp+i) == ' ' || *(temp+i) == '\t'){ printf("Usage: get <fileName>\n"); return (void *)(-1); } if (*(temp+i) == '\n') *(temp+i) = '\0'; } return temp;}char * isPutCmd(char *cmd){ char *temp = cmd; while (*temp == '\t' || *temp == ' ') temp++; if (*temp == 'p' && *(temp+1) == 'u' && *(temp+2) == 't'){ temp += 3; while (*temp == '\t' || *temp == ' ') temp++; } else { return 0; } int i; if (*temp == '\n') { printf("Usage: put <fileName>\n"); return (void *)(-1); } for (i = 0; *(temp+i) != '\0'; i++) { if (*(temp+i) == ' ' || *(temp+i) == '\t') { printf("Usage: put <fileName>\n"); return (void *)(-1); } if (*(temp+i) == '\n') *(temp+i) = '\0'; } return temp;}void quitCmd(int sockfd){ write(sockfd, "QUIT", BUFF); close(sockfd); printf("Goodbye!! Welcome to use this again!\n"); exit(0);}void pwdCmd(int sockfd){ write(sockfd, "PWD", BUFF); char buf[BUFF] = {0}; read(sockfd, buf, BUFF); if (*buf == '\0') strcpy(buf, "\n"); printf("Current server directory is %s", buf);}void dirCmd(int sockfd){ write(sockfd, "DIR", BUFF); char buf[BUFF] = {0}; while (read(sockfd, buf, BUFF) > 0){ if (buf[0] == '\n') break; printf("\t%s", buf); }}void cdCmd(char *file, int sockfd){ char buf[BUFF] = "CD "; int i; for (i = 0; file[i] != '\0'; i++) { buf[i+3] = file[i]; } buf[i+3] = '\0'; write(sockfd, buf, BUFF); // send "CD <dir>" read(sockfd, buf, BUFF); // receive "<dir>" if (*buf == '\n') { printf("fail to change directory\n"); } else { if (*buf == '\0') strcpy(buf, "\n"); printf("Current server directory is ./%s", buf); }}void cdupCmd(int sockfd){ char buf[BUFF] = {0}; write(sockfd, "CDUP", BUFF); // send "CDUP" read(sockfd, buf, BUFF); // receive "<dir>" if (*buf == '\n'){ printf("fail to change directory\n"); } else{ if (*buf == '\0') strcpy(buf, "\n"); printf("Current server directory is ./%s", buf); }}void getCmd(char *file, int sockfd){ printf("try to get file:%s\n", file); char buf[BUFF] = "GET "; int i; for (i = 0; file[i] != '\0'; i++){ buf[i+4] = file[i]; } buf[i+4] = '\0'; write(sockfd, buf, BUFF); // send "GET <file>" read(sockfd, buf, BUFF); // receive "<dataSocketPort>" or "ERROR" if (*buf == 'E'){ printf("file %s is not exist!\n", file); return; } int target; if((target = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0){ printf("error to write to file %s!\n", file); write(sockfd, "ERROR", BUFF); // send "ERROR" return; } else write(sockfd, "READY", BUFF); // send "READY" struct sockaddr_in server; int len = sizeof(server); getsockname(sockfd,(struct sockaddr*)&server, &len); register int dataSk = getSocket(inet_ntoa(server.sin_addr), atoi(buf)); int k; printf("downloading...\n"); while ((k = read(dataSk, buf, BUFF)) > 0){ write(target, buf, k); if (k != BUFF) break; } close(dataSk); close(target); printf("finished!\n");}void putCmd(char *file, int sockfd){ printf("try to upload file:%s\n", file); int source; if((source = open(file,O_RDONLY)) < 0) { printf("fail to open file %s!\n", file); return; } char buf[BUFF] = "PUT "; int i; for (i = 0; file[i] != '\0'; i++) { buf[i+4] = file[i]; } buf[i+4] = '\0'; write(sockfd, buf, BUFF); read(sockfd, buf, BUFF); // receive "<dataSocketPort>" or "ERROR" if (*buf == 'E') { printf("file %s is already exist in server!\n", file); close(source); return; } struct sockaddr_in server; int len = sizeof(server); getsockname(sockfd,(struct sockaddr*)&server, &len); register int dataSk = getSocket(inet_ntoa(server.sin_addr), atoi(buf)); int k; printf("uploading...\n"); lseek(source, 0, SEEK_SET); memset(buf, 0x0 ,BUFF); while((k = read(source,buf,BUFF)) > 0) { write(dataSk, buf, k); } write(dataSk, 0, 0); close(dataSk); close(source); printf("finished!\n");}void helpCmd(){ printf("?\n\tdisplay help message\n"); printf("!dir\n\tlist the client's current directory\n"); printf("get\n\tfetch a file from server\n\tget <filename>\n"); printf("put\n\tunload a file to server\n\tput <filename>\n"); printf("pwd\n\tdisplay current directory of server\n"); printf("dir\n\tlist files in current directory of server\n"); printf("cd\n\tchange current directory of server\n\tcd <subdirectory>|\"..\"\n"); printf("quit\n\tquit ftp client\n");}void lowerCase(char *cmd){ int i; while (*cmd == '\t' || *cmd == ' ') cmd++; for (i = 0; cmd[i] != ' '; i++){ if (cmd[i] >= 'A' && cmd[i] <= 'Z') cmd[i] += ('a'-'A'); }}void dispatch(char *cmd, int sockfd){ char *file; int r; lowerCase(cmd); while (*cmd == '\t' || *cmd == ' ') cmd++; if (*cmd == '?'){ helpCmd(); return; } if (*cmd == '!'){ if(*(cmd+1) == 'd' && *(cmd+2) == 'i' && *(cmd+3) == 'r'){ char buf[BUFF]; FILE * pf=popen("ls","r"); while(fgets(buf,BUFF,pf) != NULL){ printf("\t%s",buf); } pclose(pf); printf("\n"); return; } } else if (*cmd == 'q'){ char * temp = cmd; if (*temp == 'q' && *(temp+1) == 'u' && *(temp+2) == 'i' && *(temp+3) == 't'){ temp += 4; while (*temp == '\t' || *temp == ' ') temp++; if(*temp == '\n') quitCmd(sockfd); else return; } else return; } else if (*cmd == 'p'){ char *temp = cmd; if (*temp == 'p' && *(temp+1) == 'w' && *(temp+2) == 'd'){ temp += 3; while (*temp == '\t' || *temp == ' ') temp++; if(*temp == '\n') pwdCmd(sockfd); return; } else if((file = isPutCmd(cmd)) != 0){ if ((int)file == -1) return; else putCmd(file, sockfd); return; } else return; } else if (*cmd == 'd'){ char *temp = cmd; if (*temp == 'd' && *(temp+1) == 'i' && *(temp+2) == 'r'){ temp += 3; while (*temp == '\t' || *temp == ' ') temp++; if(*temp == '\n') dirCmd(sockfd); } return; } else if (*cmd == 'c'){ if ((file = isCdCmd(cmd)) != 0){ if ((int)file == -1) return; else if ((int)file == 1) cdupCmd(sockfd); else cdCmd(file, sockfd); return; } else return; } else if(*cmd == 'g'){ if((file = isGetCmd(cmd)) != 0){ if ((int)file == -1) return; else getCmd(file, sockfd); return; } } printf("Unknown ftp command!\n"); return;}int main(int argc, char *argv[]){ if (argc != 3){ printf("Usage:client <address> <port>\n"); return 0; } int target,ret; char buf[BUFF]; register int socketfd = getSocket(argv[1], atoi(argv[2])); if(read(socketfd,buf,BUFF) > 0){ printf("You are Client %s\n",buf); } contact(socketfd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -