ftp云盘项目

在这里插入图片描述
项目功能:
一、客户端:
(远程)
1.获取服务器的文件 get xxx
2.展示服务器有哪些文件 ls
3.进入服务器某文件夹 cd xx
4.上传文件到服务器 put xxx
(本地)
1.查看客户端本地文件 lls
2.进入客户端某文件夹 lcd
二、服务器:
1.socket
2.bind
3.listen
while(1){
accept()
fork()
server_client()(应对多个客户端)
}

宏定义config.h

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

#define IFGO 3

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

#define QUIT 9
#define DOFILE 10

struct Msg
{
        int type;
        char cmd[1024];
        char buf[128];

};             

server.c

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


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

	return 10;
}

char *getDesDir(char *cmsg)
{
	char *p;
	p = strtok(cmsg," ");
	p = strtok(NULL," ");
	return p;
}

void msg_handler(struct Msg msg,int fd)
{
	char dataBuf[1024] = {0};
	int fdfile;
	char *file = NULL;

	printf("cmd:%s\n",msg.cmd);
	int ret = get_cmd_type(msg.cmd);


	switch(ret){
		case LS:
		case PWD:
			msg.type = 0;
			FILE *r = popen(msg.cmd,"r");
			fread(msg.cmd,sizeof(msg.cmd),1,r);
			write(fd, &msg,sizeof(msg.cmd));
			break;
		case CD:
			msg.type = 1;
			char *dir = getDesDir(msg.cmd);
			printf("dir:%s\n",dir);
			chdir(dir);
			break;
		case GET:
			file = getDesDir(msg.cmd);

			if(access(file,F_OK) == -1){
				strcpy(msg.cmd,"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(getDesDir(msg.cmd),O_RDWR|O_CREAT,0666);
			write(fdfile,msg.buf,strlen(msg.buf));
			close(fdfile);
			break;
		case QUIT:
			printf("client quit!\n");
			exit(-1);
	}
}


int main(int argc,char **argv)
{
	int s_fd;
	int c_fd;
	char readBuf[128];
	int nread;
	
	//	char *msg = "I get your connect";
	struct Msg msg;
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;

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

	memset(&s_addr,0,sizeof(struct sockaddr_in));
	memset(&c_addr,0,sizeof(struct sockaddr_in));

	//1.socket
	s_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(s_fd == -1){
		perror("socket");
		exit(-1);
	}

	s_addr.sin_family = AF_INET;
	s_addr.sin_port = htons(atoi(argv[2]));
	inet_aton(argv[1],&s_addr.sin_addr);

	//2.bind
	bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));

	//3.listen
	listen(s_fd,10);
	//4.accept
	int clen = sizeof(struct sockaddr_in);

	while(1){	


		c_fd = accept(s_fd, (struct sockaddr *)&c_addr,&clen);
		if(c_fd == -1){
			perror("accept");
		}
		printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));

		if(fork() == 0){

			while(1){
				//5.read
				memset(msg.cmd,0,sizeof(msg.cmd));
				nread = read(c_fd, &msg, sizeof(msg));
				if(nread == 0){
					printf("client quit\n");
					break;
				}else if(nread > 0){
					msg_handler(msg,c_fd);
				}
			}
		}

	}
	
	close(c_fd);
	close(s_fd);
	return 0;
}

client.c

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

int get_cmd_type(char *cmd)
{
	if(strstr(cmd,"lcd"))           return LCD;
	if(!strcmp("ls",cmd))           return LS;
	if(!strcmp("pwd",cmd))          return PWD;
	if(!strcmp("quit",cmd))         return QUIT;

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

	if(!strcmp("lls",cmd))  return LLS;

	return -1;

}

char *getDir(char *cmd)
{
	char *p;
	p = strtok(cmd," ");
	p = strtok(NULL," ");
	return p;

}

int cmd_handler(struct Msg msg,int fd)
{
	char buf[32] = {0};
	char *dir = NULL;
	int filefd;

	int ret = get_cmd_type(msg.cmd);
	switch(ret){
		case LS:
		case PWD:
		case CD:
			msg.type = 0;
			write(fd,&msg,sizeof(msg));
			break;
		case GET:
			msg.type = 2;
			write(fd,&msg,sizeof(msg));
			break;	
		case PUT:
			strcpy(buf,msg.cmd);
			dir = getDir(buf);

			if(access(dir,F_OK) == -1){
				printf("%s not exist\n",dir);
			}else{
				filefd = open(dir,O_RDWR);
				read(filefd,msg.buf,sizeof(msg.buf));
				close(filefd);

				write(fd,&msg,sizeof(msg));
			}
			break;
		case LLS:
			system("ls");
			break;
		case LCD:
			dir = getDir(msg.cmd);
			chdir(dir);
			break;
		case QUIT:
			strcpy(msg.cmd,"quit");
			write(fd,&msg,sizeof(msg));
			close(fd);
			exit(-1);
	}
	return ret;
}

void handler_server_message(int c_fd,struct Msg msg)
{
	int n_read;
	int newfilefd;
	struct Msg msgget;

	n_read = read(c_fd,&msgget,sizeof(msgget));

	if(n_read == 0){
		printf("server is out,quit!\n");
		exit(-1);
	}
	else if(msgget.type == DOFILE){
		char *p = getDir(msg.cmd);
		newfilefd = open(p,O_RDWR|O_CREAT,0666);
		write(newfilefd,&msgget.cmd,strlen(msgget.cmd));
		close(newfilefd);
		putchar('>');
		fflush(stdout);
		
	}else{
		printf("-------------------------------------\n");
                printf("\n%s\n",msgget.cmd);
                printf("-------------------------------------\n");
                putchar('>');
                fflush(stdout);
	}
}

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

	int c_fd;
	char readBuf[128];
	int nread;
	//	char *msg = "message from client";
	struct sockaddr_in c_addr;

	struct Msg msg;

	memset(&c_addr,0,sizeof(struct sockaddr_in));
	
	if(argc != 3){
		printf("param is not good\n");
		exit(-1);
	}



	//1.socket
	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);

	//2.connect
	if(connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)) == -1){
		perror("connect");
		exit(0);
	}
	printf("connect...\n");
	int mark = 0;

	while(1){

		//3.send
		memset(&msg.cmd,0,sizeof(msg.cmd));
		if(mark == 0)printf(">");		

		gets(msg.cmd);

		if(strlen(msg.cmd) == 0){
			if(mark == 1){
				printf(">");
			}
			continue;
		}

		mark = 1;

		int ret = cmd_handler(msg,c_fd);
		if(ret > IFGO){
			putchar('>');
			fflush(stdout);
			continue;
		}
		if(ret == -1){
			printf("command not \n");
			putchar('>');
			fflush(stdout);
			continue;

		}

		handler_server_message(c_fd,msg);
	}

	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值