类FTP服务器(C语言)1.0版本

实现FTP服务器的部分功能
1、ls 查看服务端文件
2、pwd 查看服务端所在目录
3、lls 查看客户端文件
4、lcd xxx 进入xxx目录
5、get xxx 从服务端获取xxx文件到客户端
6、put xxx 从客户端上传xxx文件到服务端

其中,config_new.h文件如下

#define LS   1
#define PWD  2
#define QUIT 3
#define LLS  4

#define LCD  5
#define CD   6 

#define GET  7
#define PUT  8


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

int get_cmd_type(char*cmd)
{	
	if(strcmp(cmd,"ls")  ==0)      return LS;
	if(strcmp(cmd,"pwd") ==0)      return PWD;
	if(strcmp(cmd,"quit")==0)      return QUIT;
	if(strcmp(cmd,"lls") ==0)      return LLS;

	if(strstr(cmd,"lcd")!=NULL)    return LCD;
	if(strstr(cmd,"get")!=NULL)    return GET;
	if(strstr(cmd,"put")!=NULL)    return PUT;
	return -1;
}

struct msg{
	
	int   flag;
	char  cmd[32];

	char  cmd_data[1024];//LS,PWD,LLS
	char  file_data[1024];
};

服务端代码如下

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

void cmd_handler(int iClient_fd,struct msg server_Msg);
int cmd_handler_get(int iClient_fd,struct msg server_Msg);
int cmd_handler_put(int iClient_fd,struct msg server_Msg);

int main(int argc ,char**argv)
{
	int   iServer_fd;
	int   iClient_fd;
	int   iAddrLen;

	struct msg server_Msg;
	struct sockaddr_in server_Addr;
	struct sockaddr_in client_Addr;

	iServer_fd = socket(AF_INET,SOCK_STREAM,0);
	if(iServer_fd == -1){
		perror("socket:");
		return -1;
	}

	iAddrLen = sizeof(struct sockaddr);
	bzero(&server_Addr,iAddrLen);  //³õʼ»¯½á¹¹Ìå
	server_Addr.sin_family = AF_INET;  //ÉèÖõØÖ·¼Ò×å
	server_Addr.sin_port = htons(8013);	//ÉèÖö˿Ú
	server_Addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //ÉèÖõØÖ·

	if(-1 == bind(iServer_fd,(struct sockaddr *)&server_Addr,iAddrLen)){
		perror("bind:");
		return -1;
	} /* bindµÄʱºò½øÐÐת»¯ */

	if(-1==listen(iServer_fd,10)){
		perror("listen:");
		return -1;
	}	
	printf("connecting ...\n");

	int   n_recv;
	pid_t uiPid;
	
	while(1){
		iClient_fd = accept(iServer_fd,(struct sockaddr *)&client_Addr,&iAddrLen);
		if(iClient_fd == -1){
			perror("accept:");
			return -1;
		}
		uiPid = fork();
		if(uiPid == 0){
			printf("connected sucess in Server\n");
			while(1){
				memset(&server_Msg,0,sizeof(server_Msg));
				n_recv = recv(iClient_fd,&server_Msg,sizeof(server_Msg),0);
				if(n_recv == -1){perror("recv:");return -1;}
				if(n_recv == 0){
					printf("client loss\n");
					break;
				}else if(n_recv > 0){
					cmd_handler(iClient_fd,server_Msg);
				}
			}
		}
	}

	close(iServer_fd);
	return 0;

}

void cmd_handler(int iClient_fd,struct msg server_Msg)
{	
	FILE* fp;
	printf("get data:%s\n",server_Msg.cmd);

	int ret = get_cmd_type(server_Msg.cmd);
	switch(ret){
		case LS:
		case PWD:
			fp = popen(server_Msg.cmd,"r");
			fread(server_Msg.cmd_data,sizeof(server_Msg.cmd_data),1,fp);
			send(iClient_fd,&server_Msg,sizeof(server_Msg),0);
			break;
		case QUIT:
			printf("client quit\n");
			close(iClient_fd);
			break;
		case LLS:
		case LCD:
			break;
		case GET:
			cmd_handler_get(iClient_fd,server_Msg);
			break;
		case PUT:
			cmd_handler_put(iClient_fd,server_Msg);
			break;
	}//switch end	
}

int cmd_handler_put(int iClient_fd,struct msg server_Msg)
{
	int file_fd;
	char* file_name = NULL;
	file_name = get_file_name(server_Msg.cmd);
	recv(iClient_fd,&server_Msg.flag,sizeof(int),0);

	if(server_Msg.flag == -1){
		printf("file not exit\n");
		return -1;
	}else if(server_Msg.flag == 1){

		printf("get file sucess\n");
		//file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC|O_APPEND);
		file_fd = open(file_name,O_RDWR|O_CREAT);
		while(1){
			recv(iClient_fd,&server_Msg,sizeof(server_Msg),0);
			if(server_Msg.flag == 100){
				printf("get file sucess3\n");
				break;
			}
			write(file_fd,server_Msg.file_data,strlen(server_Msg.file_data)-2);
			memset(&server_Msg,0,sizeof(server_Msg));
		}
		close(file_fd);
		return 0;
	}
}

int cmd_handler_get(int iClient_fd,struct msg server_Msg)
{	
	int file_fd;
	char* file_name = NULL;
	file_name = get_file_name(server_Msg.cmd);
	if(access(file_name,F_OK) == -1){
		printf("File does not exist\n");
		server_Msg.flag = -1;
		send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
		return -1;
	}else{
		file_fd = open(file_name,O_RDONLY);
		if(file_fd == -1){
			perror("open failed");
			server_Msg.flag = -1;
			send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
			return -1;
		}else{
			server_Msg.flag = 1;
			send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
			printf("file exit\n");

		
			while(1){
					if(read(file_fd,server_Msg.file_data,sizeof(server_Msg.file_data))==0){
						server_Msg.flag = 100;
						send(iClient_fd,&server_Msg,sizeof(server_Msg),0);
						break;
					}				
					send(iClient_fd,&server_Msg,sizeof(server_Msg),0);			
					memset(&server_Msg,0,sizeof(server_Msg));
			}
			close(file_fd);
			return 0;
		}
	}
}




客户端代码如下

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

int cmd_handler(int iClient_fd,struct msg client_Msg);
int cmd_handler_get(int iClient_fd,struct msg client_Msg);
int cmd_handler_put(int iClient_fd,struct msg client_Msg);

int main()
{
	int   iClient_fd;
	int   iAddrLen;
	int   ret;

	struct msg client_Msg;
	struct sockaddr_in iClientAddr;

	iClient_fd = socket(AF_INET,SOCK_STREAM, 0);
	if(iClient_fd == -1){
		perror("socket:");
		return -1;
	}

	iAddrLen = sizeof(struct sockaddr);
	bzero(&iClientAddr,iAddrLen);  //3?¨º??¡¥?¨¢11¨¬?
	iClientAddr.sin_family = AF_INET;  //¨¦¨¨??¦Ì??¡¤?¨°¡Á?
	iClientAddr.sin_port = htons(8013);	//¨¦¨¨?????¨²
	iClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //¨¦¨¨??¦Ì??¡¤

	int iConnect = connect(iClient_fd,(struct sockaddr*)&iClientAddr,iAddrLen);
	if(iConnect == -1){
		perror("connect:");
		return -1;
	}else{
		printf("connect sucess in Clinet\n");
	}

	while(1){
		memset(&client_Msg,0,sizeof(client_Msg));
		printf(">");
		fgets(client_Msg.cmd,sizeof(client_Msg.cmd),stdin);
		if(client_Msg.cmd[strlen(client_Msg.cmd)-1]=='\n'){
			client_Msg.cmd[strlen(client_Msg.cmd)-1]='\0';
		}

		if(send(iClient_fd,&client_Msg,sizeof(client_Msg),0)==-1){
			perror("send:");
			return -1;
		}
		cmd_handler(iClient_fd,client_Msg);
	}

	close(iClient_fd);


	return 0;
}

int cmd_handler(int iClient_fd,struct msg client_Msg)
{
	int ret = get_cmd_type(client_Msg.cmd);
	char* dir_name = NULL;

	switch(ret){
			case LS:
			case PWD:
				recv(iClient_fd,&client_Msg,sizeof(client_Msg),0);
				printf("*************************\n");
				printf("%s",client_Msg.cmd_data);
				printf("*************************\n");
				break;
			case QUIT:
				printf("client exit\n");
				exit(0);	
			case LLS:
				system("ls");
				break;
			case LCD:
				dir_name = get_file_name(client_Msg.cmd);
				chdir(dir_name);
				break;
		case GET:
			cmd_handler_get(iClient_fd,client_Msg);
			break;
		case PUT:
			cmd_handler_put(iClient_fd,client_Msg);
			break;	
	}//switch end

	return 0;
}

int cmd_handler_put(int iClient_fd,struct msg client_Msg)
{
	int file_fd;
	char* file_name = NULL;
	file_name = get_file_name(client_Msg.cmd);
	if(access(file_name,F_OK) == -1){
		printf("File does not exist\n");
		client_Msg.flag = -1;
		send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
		return -1;
	}else{
		file_fd = open(file_name,O_RDONLY);
		if(file_fd == -1){
			perror("open failed");
			client_Msg.flag = -1;
			send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
			return -1;
		}else{
			client_Msg.flag = 1;
			send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
			printf("file exit\n");

		
			while(1){
					if(read(file_fd,client_Msg.file_data,sizeof(client_Msg.file_data))==0){
						client_Msg.flag = 100;
						send(iClient_fd,&client_Msg,sizeof(client_Msg),0);
						break;
					}				
					send(iClient_fd,&client_Msg,sizeof(client_Msg),0);			
					memset(&client_Msg,0,sizeof(client_Msg));
			}
			close(file_fd);
			return 0;
		}
	}
}

int cmd_handler_get(int iClient_fd,struct msg client_Msg)
{	
	int file_fd;
	char* file_name = NULL;
	file_name = get_file_name(client_Msg.cmd);
	recv(iClient_fd,&client_Msg.flag,sizeof(int),0);

	if(client_Msg.flag == -1){
		printf("file not exit\n");
		return -1;
	}else if(client_Msg.flag == 1){

		printf("get file sucess\n");
		//file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC|O_APPEND);
		file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC);
		while(1){
			recv(iClient_fd,&client_Msg,sizeof(client_Msg),0);
			if(client_Msg.flag == 100){
				printf("get file sucess3\n");
				break;
			}
			write(file_fd,client_Msg.file_data,strlen(client_Msg.file_data)-2);
			memset(&client_Msg,0,sizeof(client_Msg));
		}
		close(file_fd);
		return 0;
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值