⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.c

📁 linux网络编程 客户端 可以清除缓存
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "function.h"#include "my_client.h"#include "cmd.h"//-------------------------------------------------------------------------------------------------void run(){	while(1)	{		//print_title();   // 输出ftp> 等待用户输入		printf("ftp>");		fflush(stdin);		fgets(cmd_buf, CMD_BUFFER_SIZE, stdin);		fflush(stdin);   //清除输入缓冲区		if(cmd_buf[0]=='\n')			continue;		cmd_buf[strlen(cmd_buf)-1]='\n';		cmd_flag=intpr_cmd(cmd_buf);		switch(cmd_flag)		{			case QUIT:				cmd_quit();				return;			case LS:				cmd_ls(LS);				break;			case CD:				cmd_cd();				break;			case GET:				cmd_get();				break;			case MGET:				cmd_mget();				break;			case PUT:				cmd_put();				break;			case MPUT:				cmd_mput();				break;			case HELP:				cmd_help();				break;			case PASSIVE:				passive=(passive+1)%2;				if(passive==1)					printf("Passive mode on.\n");				else					printf("Passive mode off.\n");				break;			case USER:				cmd_user();				break;			case LCD:				cmd_lcd();				break;			case MKDIR:				cmd_mkdir();				break;			case RENAME:				cmd_rename();				break;			case RMDIR:				cmd_rmdir();				break;			case DELETE:				cmd_delete();				break;			case MIRROR:				cmd_mirror();				break;			case OPEN:				cmd_uopen();				break;			case CLOSE:				cmd_close();				break;			case LPWD:				cmd_lpwd();				break;			case LMKDIR:				cmd_lmkdir();				break;			case LRMDIR:				cmd_lrmdir();				break;			case LDIR:				cmd_ldir();				break;			case PWD:				cmd_pwd();				break;			default: 				printf("?Invalid command!\n");				break;		}	}}//-------------------------------------------------------------------------------------------------int intpr_cmd(char *cmd){	int flag;	if(strncmp(cmd,"quit",4)==0)		flag=QUIT;/*	else if(strncmp(cmd,"!",1)==0)		flag=SHELL;	else if(strncmp(cmd,"$",1)==0)		flag=MACRO;	else if(strncmp(cmd,"account",7)==0)		flag=ACCT;	else if(strncmp(cmd,"append",6)==0)		flag=APP;*/	else if(strncmp(cmd,"ls",2)==0)		flag=LS;	else if(strncmp(cmd,"cd",2)==0)		flag=CD;	else if(strncmp(cmd,"get",3)==0)		flag=GET;	else if(strncmp(cmd,"mget",4)==0)		flag=MGET;	else if(strncmp(cmd,"put",3)==0)		flag=PUT;	else if(strncmp(cmd,"mput",4)==0)		flag=MPUT;	else if(strncmp(cmd,"help",4)==0 || strncmp(cmd,"?", 1)==0)		flag=HELP;	else if(strncmp(cmd,"passive",7)==0)		flag=PASSIVE;	else if(strncmp(cmd,"user",4)==0)		flag=USER;	else if(strncmp(cmd,"lcd",3)==0)		flag=LCD;/*	else if(strncmp(cmd,"nlist",5)==0)		flag=NLIST;*/	else if(strncmp(cmd,"mkdir",5)==0)		flag=MKDIR;	else if(strncmp(cmd,"rename",6)==0)		flag=RENAME;	else if(strncmp(cmd,"rmdir",5)==0)		flag=RMDIR;	else if(strncmp(cmd,"delete",6)==0)		flag=DELETE;	else if(strncmp(cmd,"mirror",6)==0)		flag=MIRROR;	else if(strncmp(cmd,"open",4)==0)		flag=OPEN;	else if(strncmp(cmd,"close",5)==0)		flag=CLOSE;	else if(strncmp(cmd,"bye",3)==0)		flag=QUIT;	else if(strncmp(cmd,"lpwd",4)==0)		flag=LPWD;	else if(strncmp(cmd,"lmkdir",6)==0)		flag=LMKDIR;	else if(strncmp(cmd,"lrmdir",6)==0)		flag=LRMDIR;	else if(strncmp(cmd,"ldir",4)==0)		flag=LDIR;	else if(strncmp(cmd,"pwd",3)==0)		flag=PWD;	return flag;}//-------------------------------------------------------------------------------------------------int cmd_open(char* addr, char* port)  //connect连接到指定服务器的指定端口上 然后登录{	client_sockfd=socket(AF_INET, SOCK_STREAM, 0);		if(client_sockfd<0)	{		// 创建socket出错。		printf("Create client socket failed!\n");		exit(1);	}		if((get_serv_addr(addr,atoi(port),&server_addr))<0)		return -1;	if(ftp_connect(client_sockfd,&server_addr,addr)==-1) 		return -1;    	isconnect=1;	cmd_user();	return 0;}//-------------------------------------------------------------------------------------------------int get_serv_addr(char *addr, int port, struct sockaddr_in *pserver_addr) //获得服务器的地址{	if(port<=0||port>=(1<<16))	{		printf("port should be between 1 and 255.\n");		return -1;	}	bzero(pserver_addr,sizeof(struct sockaddr_in));//填充为0	pserver_addr->sin_family=AF_INET;	pserver_addr->sin_port=htons(port);	if(inet_addr(addr)!=-1)		pserver_addr->sin_addr.s_addr=inet_addr(addr);	else	{		if((server_hostent=gethostbyname(addr))!=0)		{			memcpy(&pserver_addr->sin_addr,server_hostent->h_addr,sizeof(pserver_addr->sin_addr));		}		else		{			printf("Unknown host\n");			return -1;		}	}	return 0;}//-------------------------------------------------------------------------------------------------int ftp_connect(int client_sockfd, struct sockaddr_in *pserver_addr, char *addr)  //连接到指定服务器的指定端口{	socklen_t server_addr_length = sizeof(server_addr);	if(connect(client_sockfd,(struct sockaddr*)pserver_addr, server_addr_length) < 0)	{		//输出连接服务器出错		printf("Cannot connect to %s.\n", addr);		return -1;	}	else 		printf("Connected to %s.\n", addr);	//连上去了,等待接受服务器返回的消息	if(get_reply(client_sockfd)!=220)	{		//连接错误		printf("Visit refused.\n");		return -1;	}	return 0;}//-------------------------------------------------------------------------------------------------int get_reply(int sockfd)  //接收sockfd中的返回消息,放在reply_buffer中,并输出,返回响应代码{	int i=0, flag=0, lastline=0;	char c_reply_code[4];	reply_length=read(sockfd, reply_buf, REPLY_BUFFER_SIZE-2);	if(reply_length>0)	{		reply_code=atoi(reply_buf);		c_reply_code[0]=reply_buf[0];		c_reply_code[1]=reply_buf[1];		c_reply_code[2]=reply_buf[2];	}	else	{		isconnect=0;		islogin=0;		printf("Service no available, remote server has closed connection.\n"); 		return 0;	}	reply_buf[reply_length]='\0';		while(1)	{		flag=0;		printf("%s", reply_buf);		//判断是否结束,结束则把flag置为1		for(i=0;i<reply_length;i++)		{			if(lastline==5 && reply_buf[i]=='\n')			{				lastline=6;				//printf("lastline=6\n");				flag=1;				break;			}			if(lastline==4 && reply_buf[i]=='\r')			{				lastline=5;				//printf("lastline=5\n");			}			if(lastline==3)			{				if(reply_buf[i]==' ')				{					lastline=4;					//printf("lastline=4\n");				}				else					lastline=0;			}			if(lastline==2)			{				if(reply_buf[i]==c_reply_code[2])				{					lastline=3;					//printf("lastline=3\n");				}				else					lastline=0;			}			if(lastline==1)			{				if(reply_buf[i]==c_reply_code[1])				{					lastline=2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -