1.服务端代码实现
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include "config.h"
#include <sys/stat.h>
#include <fcntl.h>
int get_cmd_type(char *cmd)
{
if (!strcmp(cmd, "ls")) return LS;
if (!strcmp(cmd, "pwd")) return PWD;
if (!strcmp(cmd, "quit")) return QUIT;
if (strstr(cmd, "cd") != NULL) return CD;
if (strstr(cmd, "get") != NULL) return GET;
if (strstr(cmd, "put") != NULL) return PUT;
return 24;
}
char *getDesDir(char *cmd)
{
char *p = NULL;
p = strtok(cmd, " ");
p = strtok(NULL, " ");
return p;
}
void msg_handler(struct Msg msg, int fd)
{
int ret;
int file_fd;
char dataBuf[1024] = {
0};
char *file = NULL;
printf("cmd: %s\n", msg.cmd);
ret = get_cmd_type(msg.cmd);
switch(ret){
case LS:
case PWD:
msg.type = 0;
FILE *fp = popen(msg.cmd, "r");
memset(msg.cmd, 0, sizeof(msg.cmd));
fread(msg.cmd, sizeof(msg.cmd), 1, fp);
write(fd, &msg, sizeof(msg));
//fwrite(&msg, sizeof(msg), 1, fp); 这里不使用fwrite是因为要通过fd将msg内容发送到客户端才能实现
pclose(fp);
break;
case CD:
msg.type = 1;
char *dir = getDesDir(msg.cmd);
printf("path_file_name: %s\n", dir);
chdir(dir); //这里不能调用system,因为system会重新开辟一个终端来进入目标路径,而服务端当前路径却是没有发生改变的
break;
case GET:
file = getDesDir(msg.cmd);
printf("file: %s\n", file);
if (access(file, F_OK) == -1){
strcpy(msg.cmd, "No This File!");
write(fd, &msg, sizeof(msg));
}
else {
msg.