ftp阅读笔记

服务端: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);
			}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值