服务端:sever.c
int main()
{
msg_handler(msg,c_fd);//指令处理函数,对ls,pwd等指令的处理
get_cmd_type(char *cmd)//判断客户端发送的指令是什么
strcmp()字符串比较函数
strstr(cmd,"cd")在字符串 cmd中查找第一次出现字符串 cd的位置,若出现了则为真
getDisDir(msg.cmd)//分隔字符串
char *p;
p = strtok(csmg," ");//以空格形式进行分隔,例如cd aa
p = strtok(NULL," ");//固定用法,将aa分隔出来
return p;返回aa
case LS:
case PWD:
msg.type = 0;
p = popen(msg.cmd,"r");
fread(msg.cmd,sizeof(msg.cmd),1,p);//ls和pwd执行后输出的内容读到msg.cmd中
write(fd,&msg,sizeof(msg));//将msg中的内容写到fd过去,再由客户端执行
case CD:
msg.type = 1;
dir = getDisDir(msg.cmd);
chdir(dir);//进入aa
case GET:
file = getDisDir(msg.cmd);
if(access(file,F_OK)==-1){//access()用于判断文件是否存在,R_OK 只判断是否有读权限;W_OK 只判断是否有写权限;X_OK 判断是否有执行权限;F_OK 只判断是否存在
strcpy(msg.cmd,"Sorry no this file");
write(fd,&msg,sizeof(msg));//将这句话上传到客户端,让用户知道这个文件不存在
}
else{
msg.type = DOFILE;
fdfile = open(file,O_RDWR);
read(fdfile,dataBuf,sizeof(dataBuf));
close(fdfile);
strcpy(msg.cmd,dataBuf);
write(fd,&msg,sizeof(msg));
}
break;
case PUT:
fdfile = open(getDisDir(msg.cmd),O_RDWR|O_CREAT,0666);//例如put aa ,就可以创建在服务端创建了aa这个文件,
write(fdfile,msg.secondbuf,strlen(msg.secondbuf));//将msg.secondbuf的内容写到aa,msg.secondbuf中的内容由客户端的文件提供在客户端代码体现
break;
case QUIT:
printf("clint quit\n");
exit(-1);
}
}
客户端代码 cline.c
int main()
{
cmd_handler(msg,c_fd)//指令处理函数,对ls,pwd等指令的处理
get_cmd_type()//判断客户端发送的指令是什么,与sever.c的类似
switch(ret){
case CD:
case PWD:
case LS:
case GET:
write(fd,&msg,sizeof(msg));将指令往服务器发送
break;
case PUT:
strcpy(buf,msg.cmd);
dir = getDir(buf);
if(access(dir,F_OK)==-1){
printf("%s this file no exit\n",dir);
}
else{
fdfile=open(dir,O_RDWR);
read(fdfile,msg.secondbuf,sizeof(msg.secondbuf));
close(fdfile);
write(fd,&msg,sizeof(msg));
}
break;
case LCD:
dir = getDir(msg.cmd);
chdir(dir);
break;
case LLS:
system("ls");
break;
case QUIT:
strcpy(msg.cmd,"quit");
write(fd,&msg,sizeof(msg));
close(fd);
exit(-1);
}
return ret;
}
c_msg_handler(struct Msg msg,int fd)//对指令信息进行处理
struct Msg msgget;
char *filename;
int newfdfile;
n_read =read(fd,&msgget,sizeof(msgget));//读取服务器数据,若数据为空说明服务器断开
if(n_read == 0){
printf("sever is quit\n");
exit(-1);
}
else if(msgget.type == DOFILE){//在服务端代码写的宏
filename=getDir(msg.cmd);//对指令进行分隔 get aa
newfdfile=open(filename,O_RDWR|O_CREAT,0666);
write(newfdfile,&msgget.cmd,strlen(msgget.cmd));
close(newfdfile);
fflush(stdout); //用来清空标准输入输出缓冲区
}
else{
printf("---------------------\n");
printf("%s\n",msgget.cmd);//msgget.cmd(=msg.cod)的内容打印出来
printf("---------------------\n");
fflush(stdout);
}
}