实现客户端对服务端的文件获取,发送,查看服务端路径,查看客户端路径

服务端

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


int get_cmd(char *cmd)         // 信号处理
{
	if(!strcmp("ls",cmd))            return LS;			//
	if(!strcmp("pwd",cmd))           return PWD;
	if(!strcmp("quit",cmd))          return QUIT;

	if(strstr(cmd,"cd")!=NULL)	 	 return CD;
	if(strstr(cmd,"get")!=NULL)	     return GET;	
	if(strstr(cmd,"put")!=NULL)	     return PUT;
	return 100;

}
char *dion_cmd(char *cmd)      //信号分割
{
	char *p=NULL;
	p=strtok(cmd," ");
	p=strtok(NULL," ");
	return p;
	
}
void msg_handler(struct Msg msg,int acc_ip)
{
	int ret;
	char *file;
	int fpfile;
	char readBuf[1024];
	printf("cmd:%s\n",msg.cmd);
	ret=get_cmd(msg.cmd);
	switch(ret){
		case LS:
		case PWD:
			msg.num=0;
			FILE *fp=popen(msg.cmd,"r");
			memset(&msg,0,sizeof(msg));
			fread(msg.data,sizeof(msg.data),1,fp);
			write(acc_ip,&msg,sizeof(msg));
			fclose(fp);
			break;
		case CD:
			msg.num=1;
			char *dir=dion_cmd(msg.cmd);
			printf("Dir:%s\n",dir);
			chdir(dir);
			break;
		case GET:
			file=dion_cmd(msg.cmd);	
			if(access(file,F_OK)==-1){
				strcpy(msg.data,"Do file");
				write(acc_ip,&msg,sizeof(msg));
			}else{
				printf("file=%s\n",file);
				msg.num=DOFILE;
				fpfile=open(file,O_RDWR);
				read(fpfile,readBuf,sizeof(readBuf));
				close(fpfile);
				strcpy(msg.data,readBuf);
				write(acc_ip,&msg,sizeof(msg));
			}
			break;
		case PUT:
			file=dion_cmd(msg.cmd);
			printf("%s\n",file);
			fpfile=open(file,O_RDWR|O_CREAT,0666);
			write(fpfile,msg.data,sizeof(msg.data));
			close(fpfile);
			break;
		case QUIT:
			printf("client out\n");
			break;
	}

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

	int soc_ip;
	int acc_ip;
	int n_read;
	struct sockaddr_in soc_r;
	struct sockaddr_in acc_t;
	struct Msg msg;
	soc_ip=socket(AF_INET,SOCK_STREAM,0);

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

	bind(soc_ip,(struct sockaddr*)&soc_r,sizeof(struct sockaddr_in));
	int clen=sizeof(struct sockaddr_in);
	listen(soc_ip,10);
	while(1){
		acc_ip=accept(soc_ip,(struct sockaddr*)&acc_t,&clen);
		if(acc_ip==-1){
			perror("accept");
			exit(-1);
		}else{
			printf("Client access:%s\n",inet_ntoa(acc_t.sin_addr));
		}
		if(fork()==0){            //创建子进程去对接客户端
			while(1){
				n_read=read(acc_ip,&msg,sizeof(msg));
				if(n_read==-1){
					printf("client out\n");
					break;
				}else if(n_read>0){
					msg_handler(msg,acc_ip);
				}
			}	
		}
	}
	close(soc_ip);
	close(acc_ip);
	return 0;
}

客户端


```c
#include <stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include  "sufei.h"
#include <fcntl.h>
#include <arpa/inet.h>

int get_cmd(char *cmd)    //信号处理
{
	if(!strcmp("ls",cmd))  		 return LS;
	if(!strcmp("lls",cmd))  	 return LLS;
	if(!strcmp("pwd",cmd))  	 return PWD;
	if(!strcmp("quit",cmd)) 	 return QUIT;
	if(strstr(cmd,"lcd"))   	 return LCD;

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

}
char *dion_cmd(char *cmd)     // 信号分割
{
	char *p=NULL;
	p=strtok(cmd," ");
	p=strtok(NULL," ");
	return p;

}

int cmd_handler(struct Msg msg,int ip)     //发送信号数据
{
	int ret;
	char *file;
	int fp;
	char buf[108];
	ret=get_cmd(msg.cmd);
	switch (ret){
		case LS :
		case PWD:
		case CD :
			msg.num=0;
			write(ip,&msg,sizeof(msg));
			break;
		case GET:
			msg.num=2;
			write(ip,&msg,sizeof(msg));
			break;
		case PUT:
			strcpy(buf,msg.cmd);	
			file=dion_cmd(buf);
			if(access(file,F_OK)==-1){
				printf("Do file\n");
			}	
			fp=open(file,O_RDWR);
			read(fp,msg.data,sizeof(msg.data));
			close(fp);
			write(ip,&msg,sizeof(msg));
			break;		
		case LLS:
			system("ls");
			break;
		case LCD:
				file=dion_cmd(msg.cmd);
				chdir(file);
				break;
		case QUIT:
			write(ip,&msg,sizeof(msg));
			
			exit(0);
			break;

	}
	return ret;	
}
void handler_server(struct Msg msg,int ip)     // 读取数据
{	
	int n_read;
	char *p;
	int op_fd;
	struct Msg msget;
	memset(&msget,0,sizeof(msget));
	n_read=read(ip,&msget,sizeof(msget));
	if(msget.num==DOFILE){
		p=dion_cmd(msg.cmd);
		printf("%s\n",p);
		op_fd=open(p,O_RDWR|O_CREAT,0600);
		write(op_fd,msg.data,strlen(msg.data));
		close(op_fd);

	}else{
		printf("--------------------------------\n");
		printf("%s\n",msget.data);
		printf("--------------------------------\n");
		fflush(stdout);
	}

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

	int soc_ip;
	struct sockaddr_in soc_r;
	struct Msg msg;

	soc_ip=socket(AF_INET,SOCK_STREAM,0);

	soc_r.sin_family=AF_INET;
	soc_r.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&soc_r.sin_addr);
	if(connect(soc_ip,(struct sockaddr*)&soc_r,sizeof(struct sockaddr))==-1){
		perror("connect");
		exit(-1);
	}else{
		printf("conmect....\n");
	}
	
	while(1){
		printf(">");
		memset(&msg,0,sizeof(msg));
		gets(msg.cmd);
		int ret=cmd_handler(msg,soc_ip);
		if(ret==-1){
			printf("input NO OK\n");
			continue;
		}
		if(ret>IFGO){
			continue;

		}
		handler_server(msg,soc_ip);


	}
	return 0;
}

#define CD 10
#define LS 1
#define GET 2
#define PWD 3
#define IFGO 4

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

#define QUIT 8
#define DOFILE 9






struct Msg      //结构体存放指令和数据
{
	int num;
	char cmd[128];
	char data[1024];
};

本项目是学习时的项目,由于水平有限如有错误希望留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值