首页 > 系统相关 >使用Linux实现FTP云盘项目2

使用Linux实现FTP云盘项目2

时间:2024-08-10 15:27:48浏览次数:13  
标签:FTP Linux 云盘 cmd char fd printf msg buf

实现功能:

ls———查看服务端文件

lls———查看客户端自己的文件

cd———切换服务端目录

lcd———切换客户端自己的目录

切换成功

put———上传文件

get———下载文件

服务器端:

客户端:

源码:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <limits.h>

#define RD_BUFSIZE	1024
#define WR_BUFSIZE	64

typedef struct c_msg{
	int fd;
	char cip_addr[16];	//ip鍦板潃淇℃伅
	uint16_t c_port;	//绔彛鍙?

}c_msg_t;


void choosecmd(char* cmd, c_msg_t* c_msg);


void * service_handle(void* arg){
	char r_buf[RD_BUFSIZE];
	c_msg_t c_msg = *(c_msg_t *)arg;
	int ret = -1;
	pthread_detach(pthread_self());
	//5.鎺ュ彈鏁版嵁
	for(;;){
		memset(r_buf, 0, sizeof(r_buf));
		ret = read(c_msg.fd, r_buf, sizeof(r_buf));
		if(ret < -1){
			pthread_exit(0);
		}
		printf("tid: %ld, fd: %d, receive data is: %s\n",pthread_self(), c_msg.fd, r_buf);
		
		choosecmd(r_buf, &c_msg);	
	}
	close(c_msg.fd);
	pthread_exit(0);
}



//鏈嶅姟鍣ㄧ殑socket
int main(int argc, char* argv[]){
	//閽堝TCP/IP鐨勭粨鏋勪綋(IP鍦板潃鍜岀鍙e彿鐨勯厤缃?
	struct sockaddr_in sin;
	bzero(&sin, sizeof(sin));

	//1.鍒涘缓绔彛	
	int s_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(s_fd < 0){
		perror("鍒涘缓绔彛澶辫触\n");
		exit(-1);
	}

	//2.閰嶇疆IP鍜岀鍙e彿
	//struct sockaddr_in {
        //     sa_family_t    sin_family; /* address family: AF_INET */
        //     in_port_t      sin_port;   /* port in network byte order */
        //     struct in_addr sin_addr;   /* internet address */
        //  };

        /* Internet address. */
        //struct in_addr {
        //   uint32_t       s_addr;     /* address in network byte order */
        // };

	sin.sin_family = AF_INET;
	sin.sin_port = htons(atoi(argv[1]));
	sin.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if(bind(s_fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
		perror("缁戝畾绔彛澶辫触\n");
		close(s_fd);
		exit(-1);
	}

	//3.閰嶇疆鐩戝惉
	if(listen(s_fd, 5) < 0){
		perror("璁剧疆鐩戝惉澶辫触\n");
		exit(-1);
	}

	//4.鎺ユ敹璇锋眰骞跺垱寤哄瓙绾跨▼
	pthread_t tid;
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	c_msg_t c_msg;
	for(;;){
		c_msg.fd = accept(s_fd, (struct sockaddr *)&cin, &addrlen);
		if(c_msg.fd < 0){
			perror("鎺ュ彈璇锋眰澶辫触\n");
			exit(-1);
 		}
		if(!inet_ntop(AF_INET, &cin.sin_addr, c_msg.cip_addr, sizeof(c_msg.cip_addr))){
			perror("鑾峰彇IP澶辫触\n");
			exit(-1);
		}
		c_msg.c_port = ntohs(cin.sin_port);
		printf("宸茬粡寤虹珛鍜孖P涓?s,绔彛涓?%d鐨勫鎴风鐨勮繛鎺n", c_msg.cip_addr, c_msg.c_port);

		pthread_create(&tid, NULL ,service_handle , &c_msg);
	}

	close(s_fd);
	exit(0);
}


void choosecmd(char* cmd, c_msg_t* c_msg){
	int cmd_id = 0;
	if(strcmp("lls\n", cmd) == 0){
		cmd_id = 1;
	}
	else if(strcmp("quit\n", cmd) == 0){
		cmd_id = 2;
	}
	else if(strstr(cmd, "lcd ")){
		cmd_id = 4;
	}
	else if(strstr(cmd, "get ")){
		cmd_id = 5;
	}
	else if(strstr( cmd, "put ")){
		cmd_id = 6;
	}
	else if(strcmp("lpwd\n", cmd) == 0){
		cmd_id = 7;
	}

	printf("cmd_id = %d\n", cmd_id);
	char rd_tmp_buf[RD_BUFSIZE];
	switch(cmd_id){
		//lls
		case 1:{
			int rd_byte;
			FILE* file = popen("ls", "r");
			if(file == NULL){
				printf("open failed!\n");
			}
			for(;;){
				rd_byte = fread(rd_tmp_buf, sizeof(rd_tmp_buf) / 16, 1, file);
				if(rd_byte < sizeof(rd_tmp_buf) / 16){
					break;
				}
			}
			write(c_msg->fd, rd_tmp_buf, strlen(rd_tmp_buf));
			printf("鎺ユ敹鍒?lls鎸囦护, 鏈嶅姟鍣ㄦ枃浠跺凡鍙戦€?...\n");
			break;
		}
		//quit
		case 2:{ 
			printf("鏂紑鍜孖P涓?s,绔彛涓?%d鐨勫鎴风鐨勮繛鎺ヤ腑...\n", c_msg->cip_addr, c_msg->c_port);
			close(c_msg->fd);
			pthread_exit(0);
			break;
		}
		//lcd
		case 4:{
			char* p = strtok(cmd, " ");
			p = strtok(NULL, " ");
			printf("%s\n", p);
			char cwd[PATH_MAX];
			if(chdir(p)){
				char e_msg[200] = "鍒囨崲浜戠洏鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶄簯鐩樼洰褰曟槸鍚﹀瓨鍦? 褰撳墠浜戠洏鐩綍涓?\n";
				getcwd(cwd, sizeof(cwd));
				strcat(e_msg, cwd);
				write(c_msg->fd, e_msg, strlen(e_msg));
				
				printf("鍒囨崲浜戠洏鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶇洰褰曟槸鍚﹀瓨鍦╘n");
				printf("浜戠洏褰撳墠宸ヤ綔鐩綍涓? %s\n", cwd);
			}else{			
				char s_msg[64] = "鍒囨崲浜戠洏鐩綍鎴愬姛, 褰撳墠鐩綍涓?";
				getcwd(cwd, sizeof(cwd));
				strcat(s_msg, cwd);
				write(c_msg->fd, s_msg, strlen(s_msg));

				printf("浜戠洏褰撳墠宸ヤ綔鐩綍涓? %s\n", cwd);
			}
			break;
		}
		//get
		case 5:{
			char c[8192];
			char* c_p = c;
			size_t rd_byte;
			char* p = strtok(cmd, " ");
			p = strtok(NULL, " ");
			printf("%s\n", p);

			if(access(p, F_OK) == -1){
				
				write(c_msg->fd ,"0" ,1);
				printf("褰撳墠璺緞涓猴紝涓嶅瓨鍦ㄨ鏂囦欢\n");
			}else{
				int des_fd = open(p, O_RDONLY);
				while((rd_byte = read(des_fd, c_p, 128) > 0)){
					c_p += rd_byte;
				}			
				write(c_msg->fd ,c ,sizeof(c));
				printf("鏂囦欢鍙戦€佹垚鍔?\n");
				close(des_fd);
			}
			break;
		}
		//put
		case 6:{

	
			break;
		}
		//lpwd
		case 7:{
			char cwd[PATH_MAX];
			getcwd(cwd, sizeof(cwd));
			write(c_msg->fd, cwd, strlen(cwd));
			printf("浜戠洏褰撳墠鎵€鍦ㄦ枃浠剁郴缁熻矾寰勪负: %s\n", cwd);
			break;
		}
		default:{
			break;
		}
	}

	

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <limits.h>
#include <sys/stat.h>
#include <fcntl.h>


#define RD_BUFSIZE	1024
#define WR_BUFSIZE	64

char w_buf[WR_BUFSIZE];
char r_buf[RD_BUFSIZE];

void choosecmd(char *cmd, int sockfd);

int main(int argc, char* argv[]){

	if(argc != 2){
		printf("杈撳叆鍙傛暟鏈夎\n");
		printf("瀹㈡埛绔垱寤哄叧闂?..\n");
		exit(-1);
	}

	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0){
		perror("瀹㈡埛绔垱寤虹鍙eけ璐n");
		exit(-1);
	}


	struct sockaddr_in dest_sin;
	socklen_t dest_s_addr = sizeof(dest_sin);
	dest_sin.sin_family = AF_INET;
	dest_sin.sin_port = htons(atoi(argv[1]));
	dest_sin.sin_addr.s_addr = htonl(INADDR_ANY);

	if(connect(sockfd,(struct sockaddr *)&dest_sin, dest_s_addr)){
		perror("杩炴帴鐩爣鏈嶅姟鍣ㄥけ璐n");
		exit(-1);
	}
	printf("杩炴帴鐩爣鏈嶅姟鍣ㄦ垚鍔?..\n");

	for(;;){
		memset(w_buf, 0, sizeof(w_buf));
		while(fgets(w_buf, sizeof(w_buf), stdin) == NULL);

		write(sockfd, w_buf, strlen(w_buf));
		choosecmd(w_buf, sockfd);		
	}
}



void choosecmd(char *cmd, int sockfd){
	int cmd_id = 0;
	if(strcmp("ls\n", cmd) == 0){
		cmd_id = 1;
	}
	else if(strcmp("lls\n", cmd) == 0){
		cmd_id = 2;
	}
	else if(strcmp("quit\n", cmd) == 0){
		cmd_id = 3;
	}
	else if(strstr(cmd, "lcd ")){
		cmd_id = 4;
	}
	else if(strstr(cmd, "cd ")){
		cmd_id = 5;
	}
	else if(strstr(cmd, "get ")){
		cmd_id = 6;
	}
	else if(strstr(cmd, "put ")){
		cmd_id = 7;
	}
	else if(strcmp(cmd, "pwd\n") == 0){
		cmd_id = 8;
	}
	else if(strcmp(cmd, "lpwd\n") == 0){
		cmd_id = 9;
	}

	printf("cmd_id = %d\n", cmd_id);
	switch(cmd_id){
		//ls
		case 1:{
			system("ls");
			//char* arg = "ls";
			//execl("/bin/ls", arg, NULL);
			break;
		}
		//lls
		case 2:{
			memset(r_buf, 0, sizeof(r_buf));			
			read(sockfd, r_buf, sizeof(r_buf));
			printf("鏈嶅姟鍣ㄦ枃浠? %s\n", r_buf);
			break;
		}
		//quit
		case 3:{
			printf("閫€鍑?..\n");
			close(sockfd);
			exit(1);
			break;
		}
		//lcd
		case 4:{
			char c[200];
			read(sockfd, c, sizeof(c));
			printf("%s\n", c);
			break;
		}
		//cd
		case 5:{
			char* p = strtok(cmd, " ");
			p = strtok(NULL, " ");
			char cwd[PATH_MAX];
			if(chdir(p)){
				printf("鍒囨崲鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶅鎴风鐩綍鏄惁瀛樺湪\n");
			}
			getcwd(cwd, sizeof(cwd));
			printf("瀹㈡埛绔綋鍓嶅伐浣滅洰褰曚负: %s\n", cwd);
			break;
		}
		//get
		case 6:{
			char c[8192];
			char* c_p = c;
			size_t rd_byte;

			
			char* p = strtok(cmd, " ");
			p = strtok(NULL, " ");			
			while((rd_byte = read(sockfd, c_p, 128)) > 0){
				c_p += rd_byte;
			}

			int des_fd = open(p, O_WRONLY | O_CREAT, 0644);
			//姣忔get閮芥槸閲嶆柊瑕嗗啓鍘熸枃浠?
			lseek(des_fd, 0, SEEK_SET);
			write(des_fd, c, sizeof(c));
			close(des_fd);
			break;
		}
		//put
		case 7:{

			break;
		}
		//pwd
		case 8:{
			printf("褰撳墠鏈湴璺緞涓?\n");
			system("pwd");
			break;
		}
		//lpwd
		case 9:{
			char cwd[PATH_MAX];
	
			read(sockfd, cwd, PATH_MAX);

			printf("褰撳墠浜戠洏璺緞涓?\n%s\n", cwd);
			break;
		}
		default:{
			printf("璇疯緭鍏ヤ互涓嬫寚浠や箣涓€:\n");
			printf("-------------------cmd-------------------\n");
			printf("1.ls	  	: 鏌ョ湅鏈湴鏂囦欢绯荤粺\n");
			printf("2.lls	  	: 鏌ョ湅浜戠洏鏂囦欢绯荤粺\n");
			printf("3.cd xx   	: 鍒囨崲鏈湴鏂囦欢璺緞\n");
			printf("4.lcd xx  	: 鍒囨崲浜戠洏鏂囦欢璺緞\n");
			printf("5.puts xx 	: 灏嗘枃浠跺瓨鍏ヤ簯鐩榎n");
			printf("6.gets xx 	: 鑾峰彇浜戠洏鏂囦欢\n");
			printf("7.pwd 		: 鏌ョ湅鏈湴鏂囦欢绯荤粺璺緞\n");
			printf("8.lpwd 		: 鏌ョ湅浜戠洏鏂囦欢绯荤粺璺緞\n");
			break;
		}
	}
}


标签:FTP,Linux,云盘,cmd,char,fd,printf,msg,buf
From: https://blog.csdn.net/2302_81386929/article/details/141072600

相关文章

  • 详解linux后台、前台运行进程
    程序运行可以有2种前台运行程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用如果终端异常关闭,导致程序会自动退出后台运行不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行。后台运行命令命令集合command&#未启动......
  • Linux计划任务
    Linux计划任务Linux计划任务是系统管理和自动化的重要工具,可以减少人工干预、提高工作效率,并有效管理系统资源和维护。使用恰当的工具,可以显著提升系统的可靠性和运行效率。1.一次性计划任务at1.1下载安装yum-yinstallat#yum下载安装systemctlstartatd......
  • 如果忘了Linux密码如何重置?
    忘记密码是我们常会遇到的情况之一,无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。忘记密码是我们常会遇到的情况之一,无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。有时候如果密码需要符合特定的复杂性要求,例如包含大写字母、小写字母、数字和特......
  • 大数据学习必备前置知识——Linux 之shell
    大数据学习必备前置知识——Linux之shell大家好!在为您带来精彩的技术干货之前,先给您推荐一个我精心运营的公众号[大数据深度洞察]。在这里,您将获取更多独家的技术分享、实用案例以及行业前沿资讯。亲爱的读者们,当您准备开启这篇充满价值的技术文章之旅时,不妨先关注我的公......
  • linux 常用知识汇总(非常全面!)
    1、Linux文件系统概述Linux文件系统是指操作系统用来控制文件如何存储和检索的结构和逻辑。文件系统结构根目录:/Linux文件系统从根目录(/)开始,这是所有文件和目录的起点。目录结构:Linux使用层次化目录结构,每个目录包含文件和子目录。挂载点:各种文件系统通过挂载点(m......
  • Linux服务管理-Nginx进阶
    通常会通过rewrite将用户的80请求转化为443请求,也就意味着Nginx需要去做虚拟主机,一个80端口的虚拟主机和一个443端口的虚拟主机,当访问80端口的虚拟主机时返回一个信息让用户去访问443端口的虚拟主机。......
  • Linux Shell编程--正则表达式、grep、sed、awk
    前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除!一、正则表达式1、正则表达式定义1.1、简介正则表达式是一种强大的文本模式匹配工具,用于搜索、替换或分割字符串。在Shell脚本中,正则表达式通常与grep、sed和awk等工具一起使用。1.2、层次分类基......
  • Linux磁盘挂载windows文件夹
    一、mountmount命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因你将光盘插为入cdrom中,Linux并不会自动挂载,必须使用Linuxmount命令来手动完成挂载。语法mount(选项)(参数)选项-V:显示程序版本;-l:显示已加载的文件系统列表;-h:显......
  • 2024最全最新VMWare以及Linux配置(含yum失效解决方案)
    血泪教训浓缩的精华配置、报错解决(解决99%问题) 目录1.Linux环境搭建1.1安装VMWare1.1.1卸载老版本VMWare(如果有的话) 1.1.2开始安装VMware1.2创建虚拟机1.3安装Centos71.4设置虚拟机快照1.5安装远程连接SSH客户端 重要:新的yum镜像源需要配置(几乎人人都要配置,必......
  • Linux中DD命令详解
    Linux中DD命令详解1.dd命令简介    功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能......