linux 文件服务站(类似ftp) C语言

linux 文件服务站(类似ftp) C语言

服务器

#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.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[128];
};

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

	return 100;
}

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};
	char *file=NULL;
	int fdfile;

	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("dir:%s\n",dir);
			chdir(dir);

			break;
		case GET:
			file=getDesDir(msg.data);

			if(access(file,F_OK)==-1)
			{
				strcmp(msg.data,"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.data,dataBuf);
				write(fd,&msg,sizeof(msg));
			}
			break;
		case PUT:
			fdfile=open(getDesDir(msg.data),O_RDWR|O_CREAT,0666);
			write(fdfile,msg.secondBuf,strlen(msg.secondBuf));
			close(fdfile);
			break;
		case QUIT:
			printf("client quit!\n");
			exit(-1);
			
	}
}

int main(int argc,char **argv)
{
	if(argc!=3)
	{
		printf("请输入正确的参数\n");
	}

	int sfd;
	int cfd;
	int nread;
	struct Msg msg;
	char readBuf[128]={0};
	struct sockaddr_in c_addr;
	struct sockaddr_in s_addr;
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	memset(&s_addr,0,sizeof(struct sockaddr_in));

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

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

	bind(sfd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));

	//listen
	
	listen(sfd,10);

	//accept
	
	while(1)
	{
		int ten=sizeof(struct sockaddr_in);
		cfd=accept(sfd,(struct sockaddr *)&s_addr,&ten);
		printf("get connect:%s\n",inet_ntoa(s_addr.sin_addr));
		if(fork()==0)
		{
			while(1)
			{
				memset(msg.data,0,sizeof(msg.data));
				nread=read(cfd,&msg,sizeof(msg));
				if(nread==0)
				{
					printf("client out\n");
					break;
				}
				else if(nread>0)
				{
					msg_handler(msg,cfd);
				}
				printf("%s\n",readBuf);
			}
		}
	}	
	//read
	close(sfd);
	close(cfd);
	return 0;
}

客户端

#include<stdio.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.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[128];
};
char *getdir(char *cmsg)
{
	char *p;
	p = strtok(cmsg," ");
	p = strtok(NULL," ");
	return p;
}
int get_cmd_type(char *cmd)
{
	if(strstr(cmd,"lcd")!=NULL)		return LCD;

	if(!strcmp("quit",cmd))		return QUIT;
	if(!strcmp("ls",cmd))		return LS;
	if(!strcmp("lls",cmd))		return LLS;
	if(!strcmp("pwd",cmd))		return PWD;
	
	if(strstr(cmd,"cd")!=NULL)		return CD;
	if(strstr(cmd,"get")!=NULL)		return GET;
	if(strstr(cmd,"put")!=NULL)		return PUT;

	return -1;
	
}

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

	ret=get_cmd_type(msg.data);

	switch(ret)
	{
		case LS:
		case CD:
		case PWD:
			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.data);
			dir=getdir(msg.data);

			if(access(dir,F_OK)==-1)
			{
				printf("%s no exsit\n",dir);
			}
			else
			{
				filefd=open(dir,O_RDWR);
				read(filefd,msg.secondBuf,sizeof(msg.secondBuf));
				close(filefd);
				write(fd,&msg,sizeof(msg));
			}
			break;
		case LLS:
			system("ls");
			break;
		case LCD:
			dir=getdir(msg.data);
			chdir(dir);
			break;
		case QUIT:
			strcpy(msg.data,"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;
	struct Msg msgget;
	int newfilefd;

	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.data);
		newfilefd=open(p,O_RDWR|O_CREAT,0600);
		write(newfilefd,msgget.data,strlen(msgget.data));
		putchar('>');
		fflush(stdout);
	}
	else
	{
		printf("-----------------------\n");
		printf("%s",msgget.data);
		putchar('\n');
		printf("-----------------------\n");

		putchar('>');
		fflush(stdout);
	}
}

int main(int argc,char **argv)
{
	struct Msg msg;
	int s_fd;
	char buf[128]={0};
	struct sockaddr_in s_addr;
	//socket
	s_fd=socket(AF_INET,SOCK_STREAM,0);
	if(s_fd==-1)
	{
		perror("socket");
	}

	//配置网络
	s_addr.sin_family=AF_INET;
	s_addr.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&s_addr.sin_addr);
	//connect
	connect(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
	printf("connect...\n");
	int mark=0;
	while(1)
	{
		memset(msg.data,0,sizeof(msg.data));
		if(mark==0)
		{
			printf(">");
		}
		//scanf("%s",msg.data);
		gets(msg.data);
		//fgets(msg.data,1024,stdin);

		if(strlen(msg.data)==0)
		{
			if(mark==1)
			{
				printf(">");
			}
			continue;
		}
		mark=1;
		
		int ret = cmd_handler(msg,s_fd);

		if(ret>IFGO)
		{
			putchar('>');
			fflush(stdout);
			continue;
		}
		if(ret==-1)
		{
			printf("command not\n");
			printf(">");
			fflush(stdout);
			continue;	
		}
		handler_server_message(s_fd,msg);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值