FTP项目(自写)

//服务端
#include <stdio.h>
#include <sys/types.h>
#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>
#include <unistd.h>

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");//程序中执行一个shell命令,并返回命令执行的结果
			fread(msg.data,sizeof(msg.data),1,r);
			write(fd,&msg,sizeof(msg));
			break;
		case CD:
			msg.type=1;
			char *dir=getDesDir(msg.data);//分割函数,运用操作需要空格指令 例如cd mkdir等等
			printf("dir:%s\n",dir);
			chdir(dir);//chdir 是C语言中的一个系统调用函数(同cd)
			break;

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

			if(access(file,F_OK)==-1){ //判断文件是否存在
				strcpy(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");
			break;




	}

}


int main(int argc,char **argv)
{
	int s_fd;
	int c_fd;
	int n_read;
	char readBuf[128];

	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	struct Msg msg;

	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));

	s_fd=socket(AF_INET,SOCK_STREAM,0);//创建套接字
	if(s_fd==-1){
		perror("socket");
		exit(-1);

	}
	s_addr.sin_family=AF_INET; //协议设置ipv4
	s_addr.sin_port=htons(atoi(argv[2]));//串口号
	inet_aton(argv[1],&s_addr.sin_addr);//ip地址

	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//为套接字添加信息

	listen(s_fd,10);

	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){
				memset(msg.data,0,sizeof(msg.data));
				n_read=read(c_fd,&msg,sizeof(msg));
				if(n_read==0){//没接收到信息退出
					printf("client out\n");
					break;

				}else if(n_read>0){
					msg_handler(msg,c_fd);
				}

			}

		}

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

//客户端
#include <stdio.h>
#include <sys/types.h>
#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>
#include <unistd.h>

char *getdir(char *cmd)
{
	char *p;

	p=strtok(cmd," ");
	p=strtok(NULL," ");

	return p;
}

int get_cmd_type(char *cmd)
{
	if(strstr(cmd,"lcd"))   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"))   return CD;
	if(strstr(cmd,"get"))  return GET;
	if(strstr(cmd,"put"))  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(buf);//getdir('d:\','请选择要备份的文件夹')

			if(access(dir,F_OK)==-1){//判断文件是否存在
				printf("%s not 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);//chdir 是C语言中的一个系统调用函数(同cd)
			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);//getdir('d:\','请选择要备份的文件夹')
		newfilefd=open(p,O_RDWR|O_CREAT,0600);
		write(newfilefd,msgget.data,strlen(msgget.data));
		putchar('>');
		fflush(stdout);
	}
	else{
		printf("------------------------------\n");
		printf("\n%s\n",msgget.data);
		printf("------------------------------\n");

		putchar('>');
		fflush(stdout);//fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
	}

}



int main(int argc,char **argv)
{
	int c_fd;
	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);

	}

	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); //转换网络能识别的格式

	if(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr))==-1){//连接
		perror("connect");
		exit(-1);
	}
	printf("connect ...\n");
	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_handler(msg,c_fd);

		if(ret>IFGO){

			putchar('>');
			fflush(stdout);//fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
			continue;  
		} 
		if(ret==-1){
			printf("command not\n");
			printf(">");
			fflush(stdout);
			continue;
		}    
        handler_server_message(c_fd,msg);

	}
	return 0;
}



config.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];

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈学弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值