ftp云盘—客户端client

本文介绍了如何通过TCP和套接字实现FTP云盘客户端的功能,包括ls、pwd、cd、get和put命令的处理,以及服务端的相应功能。重点展示了命令解析、文件交互和错误处理的代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目ftp云盘,代码编写分为客户端,服务端,配置文件
通过TCP协议,利用套接字socket具体实现。
实现功能分为客户端(lls,lpwd,lcd),服务端(ls,cd,pwd,)以及双方文件交互功能(get,put)

此为ftp云盘客户端

//包含头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include "msg.h"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>


//处理接收到的命令,通过配置文件中的宏定义返回相应int值
int handler_cmd(char *cmd)
{

	if(strstr(cmd,"lcd"))		return LCD;

	if(!strcmp("lls",cmd))		return LLS;
	if(!strcmp("lpwd",cmd))		return LPWD;
	if(!strcmp("ls",cmd)) 		return LS;

	if(!strcmp("pwd",cmd))		return PWD;
	if(strstr(cmd,"cd"))		return CD;

	if(strstr(cmd,"put"))		return PUT;
	if(strstr(cmd,"get"))		return GET;

	if(!strcmp("quit",cmd))		return QUIT;
	
	return -1;
}


void interface()
{
	printf("==========================\n");
}

//cd put get命令需要分割字符串,获取第二个字符即相应文件
char *hand_message(char *cmd)
{
	char *p;
	p = strtok(cmd," ");
	p = strtok(NULL," ");
	return p;

}

//处理完数据后,通过此函数来响应即打印结果或者其他
void cmd_server_msg(struct Msg msg,int fd,int ret)
{
	int n_read;
	struct Msg msgget;	

	n_read = read(fd,&msgget,sizeof(msgget));
	if(n_read == 0){
		printf("client quit\n");
		exit(0);
	}else if(ret == 8){
		char *p = hand_message(msg.data);
		int f_fd = open(p,O_RDWR|O_CREAT,0600);
		if(f_fd == -1){
			perror("open");
		}
		write(f_fd,msgget.data,strlen(msgget.data));
	
	}else{
		printf("==========================\n");
		printf("%s\n",msgget.data);
		printf("==========================\n");
	}
}

//处理命令,根据返回值处理实际命令
int cmd_server(struct Msg msg,int fd)
{
    char *dir;
	char *file = NULL;
	int ret;
	int p_fd;
	char data[128];
	ret = handler_cmd(msg.data);

	switch(ret){
		case LS:
		case PWD:
			write(fd,msg.data,sizeof(msg.data));
			break;
		case CD:
			write(fd,msg.data,sizeof(msg.data));
			read(fd,&msg,sizeof(msg));
			printf("%s\n",msg.data);
			break;
		case LLS:
            system("ls");
			interface();
            break;
		case LPWD:
            system("pwd");
			interface();
            break;
		case LCD:
            dir = hand_message(msg.data);
			if(access(dir,F_OK)){
	            printf("no this file!\n");
            }
			else{
             	chdir(dir);
			}
            break;

		case PUT:
			strcpy(data,msg.data);
			file = hand_message(data);
			if(access(file,F_OK) == -1){
				printf("%s,the file not exit\n",file);	
                        }else{
				p_fd = open(file,O_RDWR);
				read(p_fd,msg.dataBuf,sizeof(msg.dataBuf));
				close(p_fd);

				write(fd,&msg,sizeof(msg));
			}
			break;
		case GET:
			write(fd,&msg,sizeof(msg));	
			interface();
			break;
		case QUIT:
			strcpy(msg.data,"quit");
			write(fd,msg.data,sizeof(msg.data));
			close(fd);
			exit(0);

	}
 	return ret;

}
void display()
{
	
	printf("==========================\n");
	printf("==========================\n");
	printf("==========================\n");
	printf("welcom to Aaron ftp Cloud disk\n");
	printf("==========================\n");
	printf("==========================\n");
	printf("==========================\n");

}

int main(int argc,char **argv)
{
	int c_fd;

	struct sockaddr_in c_addr;
	char readBuf[128];
	int n_read;
	struct Msg msg;


	if(argc != 3){
		printf("param error\n");
		exit(-1);
	
	}

	c_fd = socket(AF_INET,SOCK_STREAM,0);
	if(c_fd == -1){
		perror("socket");
		exit(-1);
	}
	c_addr.sin_family = AF_INET;
	c_addr.sin_port = htons(atoi(argv[2]));
	inet_aton(argv[1],&c_addr.sin_addr);
	
	
	int clen = sizeof(struct sockaddr);
	if(connect(c_fd,(struct sockaddr *)&c_addr,clen) == -1){
		perror("connect");
		
	}
	printf("accepted...\n");
	
	display();	
	while(1){	
		memset(&msg,0,sizeof(msg));
		printf(">");
		gets(msg.data);
		
		int ret = cmd_server(msg,c_fd);
		//找不到则返回-1,表示命令不支持
		if(ret == -1){
			printf("conmand not\n");
			continue;
		}
		//返回值小于直接在客户端执行,不往服务端走		
		if(ret < 6){
			interface();
			if(ret < 4){
				printf(">");
			}
			continue;
		}
		
		cmd_server_msg(msg,c_fd,ret);
		
	}
	
	close(c_fd);	
	return 0;

}

上接配置文件
配置文件

下接服务端
服务端

学识浅薄,希望能帮到您

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值