linux下的ftp文件服务器

1、ftp文件服务器的功能,客户端通过访问服务器的ip地址和端口,可以连接到服务器。客户端连接成功后,可以拷贝服务器下的文件和访问服务器的文件夹,同时可以将自己的文件拷贝给服务器
2、服务器demo

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#define LS 0
#define PWD 1
#define GET 2
#define IFGO 3
#define QUIT 8
#define PUT 5
#define CD 6
#define DOFILE 9
struct Msg
{ 
 	int type;
 	char cmd[1024];
 	char readBuf[1024];
};
int str_cmp(char *cmd)
{
 	if(!strcmp("ls",cmd))
 		return LS;
	if(!strcmp("pwd",cmd))
  		return PWD;
 	if(!strcmp("quit",cmd))
  		return QUIT;
 	if(strstr(cmd,"get")!=NULL)
  		return GET;
 	if(strstr(cmd,"put")!=NULL)
  		return PUT;
 	if(strstr(cmd,"cd")!=NULL)
  		return CD;
 	return 100;
}
//获取要切换的文件夹和要拷贝的文件名字
char *getDirFile(char *cmd)
{
 	char *p;
	p = strtok(cmd," ");
 	p= strtok(NULL," ");
 	return p;
}
switch (ret)
 {
  	case LS:
  	case PWD:
   		msg.type = 0;
   		fd = popen(msg.cmd,"r");
   		fread(msg.readBuf,sizeof(msg.readBuf),1,fd); 
   		int n_write =write(c_fd,&msg,sizeof(msg));
   		if(n_write == -1)
   		{
    			perror("write error");
   		}
   		break;
  	case CD:
   		msg.type = 1;
    		char *dir = getDirFile(msg.cmd);
   		printf("dir :%s\n",dir);
   		chdir(dir);
   		break;
   	case QUIT:
   		printf("client out\n");
   		break;
  	case GET:
   		strcpy(buf,msg.cmd);
   		file = getDirFile(buf);
   		if((access(file,F_OK))==-1)
   		{
    			strcpy(msg.readBuf,"no this file");
    			write(c_fd,&msg,sizeof(msg));
   		}
   		else
   		{
    			msg.type = DOFILE;
    			int fd1 = open(file,O_RDWR);
    			read(fd1,msg.readBuf,sizeof(msg.readBuf));
    			write(c_fd,&msg,sizeof(msg));
    			close(fd1);
   		}
   		break;
 int main(int argc ,char**argv)
{
 	int sever_id;
 	int client_fd;
 	struct Msg msg;
 	int severRead;
 	if(argc !=2)
 	{
  		printf("param error\n");
  		exit(-1);
 	}
 	struct sockaddr_in sever_addr;
 	struct sockaddr_in client_addr;
 	sever_addr.sin_family = AF_INET;
 	sever_addr.sin_port =htons( atoi(argv[1]));
 	inet_aton("127.0.0.1",&sever_addr.sin_addr);
 	sever_id = socket(AF_INET,SOCK_STREAM,0);
 	if(sever_id == -1)
 	{
  		perror("socket error");
  		exit(-1);
 	}
 	bind(sever_id,(struct sockaddr *)&sever_addr,sizeof(struct sockaddr_in));
 	listen(sever_id,10);
  	while(1)
 	{
  		client_fd = accept(sever_id,NULL,NULL);
  		if(client_fd  == -1)
  		{
   			perror("accept error");
   			exit(-1);
  		}
  		if(fork()==0)
  			{
   				printf("one client connected\n");
   				while(1)
   				{ 
    					memset(msg.cmd,'\0',sizeof(msg.cmd));
    					severRead  = read(client_fd,&msg,sizeof(msg)); 
    					if(severRead==0)
    					{
     						printf("client out\n");
     						break;
    					}
    					else
    					{
     						handler_msg(msg,client_fd);
    					}
   				}
  			}
 	}
 	close(sever_id);
 	close(client_fd);
 	return 0;
}

3、客户端demo

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#define LS 0
#define PWD 1
#define GET 2
#define IFGO 3
#define QUIT 8
#define LCD 10 
#define LLS 5
#define PUT 7
#define CD 6
#define DOFILE 9
struct Msg
{
 	int type;
 	char cmd[1024];
 	char readBuf[2048];
};
int str_cmp(char *cmd)
{
        if(!strcmp("ls",cmd))
                return LS;
        if(!strcmp("pwd",cmd))
                return PWD;
        if(!strcmp("quit",cmd))
                return QUIT;
  	if(!strcmp("lls",cmd))
    		return LLS;
  	if(strstr(cmd,"lcd")!=NULL)
    		return LCD;
  	if(strstr(cmd,"get")!=NULL)
                return GET;
  	if(strstr(cmd,"put")!=NULL)
    		return PUT;
  	if(strstr(cmd,"cd")!=NULL)
    		return CD;
  	return -1;
}
char *getDirFile(char *cmd)
{
        char *p;
        p = strtok(cmd," ");
        p= strtok(NULL," ");
        return p;
}
void sever_client_msg(struct Msg msg,int c_fd)
{
 	char buf[128];
 	int n_read;
 	char *file = NULL;
 	struct Msg msgget;
 	memset(msgget.readBuf,0,sizeof(msgget.readBuf));
 	n_read = read(c_fd,&msgget,sizeof(msgget));
 	if(n_read  == -1)
 	{
  		printf("sever is out\n");
  		exit(-1);
 	}
 	else if(msgget.type==DOFILE)
 	{
  		file = getDirFile(msgget.cmd);
  		int fd = open(file,O_RDWR|O_CREAT|O_TRUNC,0666);
  		if(fd==-1)
  		{
   			perror("open error");
  		}
  		write(fd,msgget.readBuf,strlen(msgget.readBuf));
  		putchar('>');
 	}
 	else
 	{
  		printf("--------------\n");
  		printf("\n%s\n",msgget.readBuf);
  		printf("--------------\n");
  		putchar('>');
 	}
}
int handler_msg(struct Msg msg,int c_fd)
{
        int ret;
  	char buf[128]={0};
        char *file = NULL;
        ret = str_cmp(msg.cmd);
        switch (ret)
        {
   		case CD:
           	case LS:
            	case PWD:
     			msg.type = 0;
     			write(c_fd,&msg,sizeof(msg));
    			break;
            	case GET:
     			msg.type  = 2;
     			write(c_fd,&msg,sizeof(msg));
     			printf("%s\n",msg.cmd);
     			break;
 		case LLS:
   			system("ls");
   			break;
  		case LCD:
   			file = getDirFile(msg.cmd);
   			printf("dir:%s\n",file);
   			chdir(file);
   			printf("dir:%s\n",file);
   			break;
  		case PUT:
   			strcpy(buf,msg.cmd);
   			file = getDirFile(buf);
   			if((access(file,F_OK))==-1)
   			{
    				printf("client no this file\n");
   			}
   			else
   			{
    				int fd = open(file,O_RDWR);
    				read(fd,msg.readBuf,sizeof(msg.readBuf));
    				close(fd);
    				write(c_fd,&msg,sizeof(msg));
   			}
   			break;
  		case QUIT:
   			strcpy(msg.cmd,"quit");
   			write(c_fd,&msg,sizeof(msg));
   			close(c_fd);
   			exit(-1);
 	}
	 return ret;
}
int main(int argc,char**argv)
{
 	int mark=0;
 	int ret;
 	int client_id;
 	struct Msg msg;
 	if(argc !=3)
 	{
  		printf("param error\n");
  		exit(-1);
 	}
 	struct sockaddr_in client_addr;
 	client_addr.sin_family = AF_INET;
 	client_addr.sin_port= htons(atoi(argv[2]));
 	inet_aton(argv[1],&client_addr.sin_addr);
 	client_id = socket(AF_INET, SOCK_STREAM ,0);
 	if(client_id == -1)
 	{
  		perror("socket error");
  		exit(-1);
 	}
 	connect(client_id,(struct sockaddr *)&client_addr,sizeof(struct sockaddr_in));
 	while(1)
 	{
  		printf("input\n");
 	 	memset(msg.cmd,0,sizeof(msg.cmd));
  		if(mark==0)
  		{
   			putchar('>');
  		}
  		gets(msg.cmd);
  		ret = handler_msg(msg,client_id);
  		if(ret>IFGO) 
  		{
   			putchar('>');
   			continue;
  		}
  		if(ret==-1)
  		{
   			printf("cmd error\n");
   			putchar('>');
   			continue;  
  		}
  		sever_client_msg(msg,client_id);
 	}
 	close(client_id);
 	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值