类FTP云盘项目(Linux文件管理系统)

ftpconfig.h

#define LS 0
#define GET 1
#define PWD 2

#define IFGO 3

#define LCD 4
#define LLS 5
#define CD 6
#define PUT 7

#define QUIT 8
#define DOFILE 9

struct Msg
{
	int type;
	char data[1024];
	char secondBuf[1024];

};

ftpserver2.c (在NetCodes目录下)



int get_cmd_type(char *cmd)//将字符串型的命令转化为整数(宏),用作后续处理判断。
	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文件路径取出来。
{
	char *p;
	p=strtok(data," ");
	p=strtok(NULL," ");
	return p;
}


int  msg_handle(struct Msg msg,int fd)//指令处理函数(处理客户端发来的指令)
{
	int file_fd;
	char dataBuf[1024]={0};
	char *filename=NULL;
	printf("Cmd:%s\n",msg.data);
	int ret = get_cmd_type(msg.data);
	switch(ret)
	{
		case LS:
		case PWD:
			{
				msg.type=0;
				FILE *r = popen(msg.data,"r");
				fread(msg.data,sizeof(msg.data),1,r);
				write(fd,&msg,sizeof(msg));
				break;
			}
		case CD:
			{	msg.type=1;
				char *dir = getDesDir(msg.data);
				printf("server dir:%s\n",dir);
				chdir(dir);
				break;
			}
		case GET:
			filename  =  getDesDir(msg.data);
			if(access(filename,F_OK)==-1)
			{
				strcpy(msg.data,"this file don't found!");
				write(fd,&msg,sizeof(msg));
			}
			else
			{
				msg.type=DOFILE;
				file_fd = open(filename,O_RDWR);
				read(file_fd,dataBuf,sizeof(dataBuf));
				close(file_fd);
				strcpy(msg.secondBuf,dataBuf);
				write(fd,&msg,sizeof(msg));
			}
			break;
		case PUT:
			filename = getDesDir(msg.data);
			file_fd = open (filename,O_CREAT|O_RDWR,0666);
			write(file_fd,msg.secondBuf,strlen(msg.secondBuf));
			close (file_fd);
			break;
		case QUIT:
			printf("client quit!\n");
			//exit(-1);
			break;
	}
	return ret;
}


int main(int argc,char * argv[])
{
	if(argc!=3)
	{
		printf("argumens num is erro\n");
		exit(-1);
	}
	int s_fd,c_fd;
	int n_read;
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	char r_buff[128]={0};
	char x ;
	struct Msg msg;
	s_addr.sin_family=AF_INET;//ipv4因特网域
	s_addr.sin_port=htons(atoi(argv[2]));//将端口号从主机字节序,转化为网络字节序。
	inet_aton(argv[1],&(s_addr.sin_addr));//将Ip地址从字符串类型转变为网络能识别的模式,并赋给s_addr.sin_addr。

	//1.socket创建套接字
	s_fd=socket(AF_INET,SOCK_STREAM,0);
	if(s_fd==-1)
	{
		perror("socket\n");
		exit(-1);
	}
	//2.bind绑定主机ip和端口号
	if(bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in)))
	{
		perror("bind\n");
		exit(-1);
	}
	//3.listen监听网络
	if(listen(s_fd,10))
	{
		perror("listen\n");
		exit(-1);
	}
	//4.accept等待客户端接入
	int len=sizeof(struct sockaddr_in);

	while(1)
	{
		c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&len);
		if(c_fd==-1)
		{
			printf("accept\n");
			exit(-1);
		}
		printf("=====connect success=====\n");
		printf("%s is connected\n ",inet_ntoa(c_addr.sin_addr));
		//5.read
		if(fork()==0)//创建一个子进程
		{		
			while(1)
			{
				memset(msg.data,0,sizeof(msg.data));//将存储客户端指令的变量先清空,为后续存储指令做准备。
				n_read = read(c_fd,&msg,sizeof(msg));//将已连接的客户端中的指令读取出来,存入msg中。
				if (n_read==0)
				{
					char* client_ip = inet_ntoa(s_addr.sin_addr);
					printf("%s client out \n",client_ip);
					break;
				}
				else if (n_read>0)
				{
					msg_handle(msg,c_fd);
				}

			}
			int fpid = getppid();
			printf("Do you want kill server?(y/n)\n");
			char c =getchar();
			if(c=='y')
			{
				kill(fpid,SIGKILL);
			}
		}
	}
	printf("Server will shutdown!\n");
	close (c_fd);
	close (s_fd);
	return 0;
}

ftpclient.c (在/NetCodes/hkx里面)

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include "ftpconfig.h"
#include <sys/stat.h>
#include <fcntl.h>

//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,	socklen_t addrlen);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//int listen(int sockfd, int backlog);

char * getdir(char * data)
{
	char *p;
	p=strtok(data," ");
	p=strtok(NULL," ");
	return p;
}

int get_cmd_type(char *cmd)
{
	if(!strcmp(cmd,"lls"))			return LLS;
	if(!strcmp(cmd,"ls"))			return LS;
	if(!strcmp(cmd,"pwd"))			return PWD;
	if(!strcmp(cmd,"quit"))			return QUIT;
	if(strstr(cmd,"lcd")!=NULL)		return LCD;
	if(strstr(cmd,"cd")!=NULL)		return CD;
	if(strstr(cmd,"get")!=NULL)		return GET;
	if(strstr(cmd,"put")!=NULL)		return PUT;

	return -1;
}



void handle_server_message(struct Msg msg,int c_fd)
{
	int n_read;
	struct Msg msgget;
	int newfilefd;
	n_read = read(c_fd,&msgget,sizeof(msgget));
	if(n_read ==-1)
	{
		printf("server is out of link ,quit\n");
		exit(-1);

	}
	else if(msgget.type==DOFILE)
	{
		char *p=getdir(msg.data);
		printf("dir is %s\n",p);
		newfilefd = open(p,O_RDWR|O_CREAT,0666);
		if (newfilefd==-1)
		{
			perror("client open");
			exit(-1);
		}
		if(write(newfilefd,msgget.secondBuf,strlen(msgget.secondBuf))==-1)
		{
			perror("client write");
			exit(-1);
		}
		close(newfilefd);
		putchar('>');
		fflush(stdout);

	}
	else
	{
		printf("---------------------------\n");
		printf("%s\n",msgget.data);
		printf("---------------------------\n");
		putchar('>');
		fflush(stdout);
	}

}



int cmd_handle(struct Msg msg,int fd)
{
	int file_fd;
	char dataBuf[1024]={0};
	char *dir=NULL;
	int ret = get_cmd_type(msg.data);

	if (ret == -1)
	{
		printf("Don't found your cmd!\n");
	}
	switch(ret)
	{
		case LS:
		case PWD:
		case CD:
			write(fd,&msg,sizeof(msg));
			break;
		case GET:
			write(fd,&msg,sizeof(msg));
			break;
		case PUT:
			strcpy(dataBuf,msg.data);
			dir = getdir(dataBuf);
			if (access(dir,F_OK)==-1)
			{
				printf("%s not exist\n",dir);

			}
			else
			{
				file_fd=open(dir,O_RDWR);
				char buf[256] ={0};
				read(file_fd,buf,sizeof(buf));
				strcpy(msg.secondBuf,buf);
				close(file_fd);
				write(fd,&msg,sizeof(msg));

			}
			break;
		case LLS:
			system("ls");
			break;
		case LCD:
			dir = getdir(msg.data);
			printf("client dir:%s\n",dir);
			chdir(dir);
			break;
		case QUIT:
			strcpy(msg.data,"quit");
			write(fd,&msg,sizeof(msg));
			close(fd);
			exit(-1);
	}
	return ret;

}


int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("arugumens num is erro\n");
		exit(-1);
	}
	int c_fd;
	int n_write;
	int n_read;
	struct sockaddr_in c_addr;
	char r_buff[156]={0};
	char w_buff[156]={0};
	c_addr.sin_family=AF_INET;
	c_addr.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&(c_addr.sin_addr));
	struct Msg msg;
	//1.socket
	c_fd=socket(AF_INET,SOCK_STREAM,0);
	if(c_fd==-1)
	{
		perror("socket\n");
		exit(-1);
	}
	//2.connect
	int flag = connect (c_fd,(struct sockaddr*)&c_addr,sizeof (struct sockaddr_in));
	if(flag==-1)
	{
		perror("connect");
		exit(-1);
	}
	printf("connect...");
	int mark = 0;
	while(1)
	{
		memset(msg.data,0,sizeof(msg.data));
		if(mark==0)
			printf(">");
		gets(msg.data);
		if(strlen(msg.data)==0)
		{
			if(mark==1)
			{
				printf(">");
				continue;
			}
		}
		mark = 1;
		int ret = cmd_handle(msg,c_fd);
		if(ret>IFGO)
		{
			putchar('>');
			fflush(stdout);//清空标准输出缓冲区
			continue;
		}
		else if (ret==-1)
		{
			printf("unvailable cmd!\n");
			printf(">");
			fflush(stdout);
			continue;
		}
		handle_server_message(msg,c_fd);
	}
	return 0 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值