本文共 4376 字,大约阅读时间需要 14 分钟。
在本节中,我们将重点分析服务器端的实现细节。服务器端代码主要包含以下几个部分:
#include#include #include #include #include #include #include #include #include #include #include "config.h"
int option_cmd(char *cmd){ if (strcmp(cmd, "ls") == 0) return LS; if (strcmp(cmd, "pwd") == 0) return PWD; if (strcmp(cmd, "quit") == 0) return QUIT; if (strstr(cmd, "cd") != NULL) return CD; if (strstr(cmd, "get") != NULL) return GET; if (strstr(cmd, "put") != NULL) return PUT;}
char *GetDir(char *dircmd){ char *p; p = strtok(dircmd, " "); p = strtok(NULL, " "); return p;}
void command(struct Message msg, int fd){ char cmdbuf[1024] = {0}; char *file = NULL; int file_fd; printf("the client cmd is: %s\n", msg.data); int cmd = option_cmd(msg.data); switch(cmd) { case LS: msg.type = 0; FILE *p = popen(msg.data, "r"); fread(msg.data, sizeof(msg.data), 1, p); write(fd, &msg, sizeof(msg)); break; case PWD: msg.type = 0; write(fd, &msg, sizeof(msg)); break; case QUIT: printf("the client die out\n"); exit(-1); break; case CD: msg.type = 1; char *dir = GetDir(msg.data); break; case PUT: file_fd = open(GetDir(msg.data), O_CREAT | O_RDWR, 0666); write(file_fd, msg.msgbuf, strlen(msg.msgbuf)); close(file_fd); break; case GET: file = GetDir(msg.data); if (access(file, F_OK) == -1) { strcpy(msg.data, "the file don't exit"); write(fd, &msg, sizeof(msg)); } else { msg.type = DOFILE; file_fd = open(file, O_RDWR); read(file_fd, cmdbuf, sizeof(cmdbuf)); close(file_fd); strcpy(msg.data, cmdbuf); write(fd, &msg, sizeof(msg)); } break; default: break; }}
客户端代码的实现主要包含以下几个部分:
#include#include #include #include #include #include #include #include #include #include #include "config.h"
int option_cmd(char *cmd){ if (strcmp(cmd, "ls") == 0) return LS; if (strcmp(cmd, "pwd") == 0) return PWD; if (strcmp(cmd, "lls") == 0) return LLS; if (strcmp(cmd, "quit") == 0) return QUIT; if (strstr(cmd, "get") != NULL) return GET; if (strstr(cmd, "put") != NULL) return PUT; if (strcmp(cmd, "cd") == 0) return CD; if (strstr(cmd, "lcd") != NULL) return LCD; return -1;}
char *GetDir(char *cmd){ char *p; p = strtok(cmd, " "); p = strtok(NULL, " "); return p;}
int option_cmd_handle(struct Message msg, int fd){ char buf[128] = {0}; char cmdbuf[1024]; int CMD; strncpy(buf, msg.data, sizeof(msg.data)); char *dir = GetDir(buf); CMD = option_cmd(buf); switch(CMD) { case LS: case PWD: msg.type = 0; write(fd, &msg, sizeof(msg)); break; case CD: msg.type = 1; write(fd, &msg, sizeof(msg)); break; case LCD: chdir(dir); break; case QUIT: strcpy(msg.data, "quit"); write(fd, &msg, sizeof(msg)); close(fd); exit(-1); break; case LLS: system("ls"); break; case GET: write(fd, &msg, sizeof(msg)); break; case PUT: strcpy(cmdbuf, msg.data); if (access(dir, F_OK) == -1) { printf("the %s file is no have\n", dir); } else { file_fd = open(dir, O_RDWR); read(file_fd, msg.msgbuf, sizeof(msg.msgbuf)); close(file_fd); write(fd, &msg, sizeof(msg)); } break; default: break; } return CMD;}
通过上述分析可以看出,FTP服务器与客户端的实现主要包含以下几个关键部分:
整个实现过程体现了TCP/IP协议栈的应用,尤其是socket编程的核心知识点。
转载地址:http://eotnz.baihongyu.com/