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

📄 parser.c

📁 自己写的一个ftp client
💻 C
字号:
#include"global.h"#include"parser.h"#include"controlmodule.h"//////////////////////define some usercmd's number//////////////////////////#define ERROR 0#define OPEN 1#define LS 2#define CD 3#define GET 4#define PUT 5#define quit 100/////////////////////////////////////divide///////////////////////////////////////////////////////void getcmdandarg(char *str,char *cmd,char *arg){	int tag=0;//	printf("enterring getcmdandarg()\n");	while( *(str+tag)!=' ' && *(str+tag)!='\0' ){		tag++;	}//	printf("tag:%d\n",tag);	int tmp=0;	while(tmp<tag){		*cmd++=*str++;		tmp++;	}	*(cmd)='\0';	if( *str=='\0' ){		*arg='\0';		return;		printf("arg empty!\n");	}	str++;//	printf("before get arg\n");	while(*str!='\0'){		*arg++=*str++;	}	*(arg)='\0';}//////////////////////////mapping//////////////////////////////////////////////////////////////int cmdmappingnum(char *cmd){	if( strcmp(cmd,"open")==0 )		return OPEN;	else if( strcmp(cmd,"quit")==0 )		return quit;	else if( strcmp(cmd,"ls")==0 )		return LS;	else if( strcmp(cmd,"cd")==0 )		return CD;	else if( strcmp(cmd,"get")==0 )		return GET;	else if( strcmp(cmd,"put")==0 )		return PUT;	else		return ERROR;}/////////////////the following function do paser()'s detail parse/////////////////////////void doquit(char * arg){	if(status==DISCONNECTED){		exit(0);	}	int firstrc=ftpcmd("QUIT",NULL);	if(firstrc!=2){		printf( "quit failed, you can try again!\n");	}	printf("quit\n");	exit(0);}void doopen(char *arg){	printf("open\n%s\n ",arg);	strcpy(remoteaddr,arg);//	char *recbuf= malloc( sizeof(char)*4096 );	struct linebuf* recbuf=inilinebuf(1024);	int firstrc;	//do things for connet to remote	struct sockaddr_in remote;	bzero( &remote , sizeof(remote) );	remote.sin_family=AF_INET;	remote.sin_port=htons(21);	inet_pton( AF_INET , remoteaddr , &remote.sin_addr.s_addr );	if( ( controlfd=socket(AF_INET,SOCK_STREAM,0) ) ==-1 ){		perror("socket()\n");	}	if( connect( controlfd , (struct sockaddr*)&remote , sizeof(remote) )== -1 ){		perror("connect()\n");	}	status=CONNECTED;	readline( controlfd , recbuf );	printf("%s",recbuf);	/////then enter the username//////////////	printf("USER: ");	getline(username);	printf("%s\n",username);	firstrc = ftpcmd("USER",username);	switch(firstrc){		case 1:			printf("get a unexpected reply, open failed!\n");			status=LOGINERROR;			return;		case 2:			status=LOGINED;			goto S;		case 3:			printf("PASSWORD: ");			char *pass=malloc( sizeof(char)*20 );			if(pass==NULL){				perror("malloc failed!\n");			}			getline(pass);			firstrc=ftpcmd("PASS",pass);			printf("%d\n",firstrc);			break;		default:			printf("get a bad reply, open failed!\n");			status=LOGINERROR;			return;	}	switch(firstrc){		case 1:			printf("get a unexpected reply, open failed!\n");			status=LOGINERROR;			return;		case 2:			status=LOGINED;			goto S;		case 3:		//ACCT function need!			printf("ACCOUNT: ");			char *account=malloc( sizeof(char)*30 );			if( account==NULL ){				perror("malloc failed!\n");			}			getline(account);			firstrc=ftpcmd("ACCT",account);			break;		default:			printf("get a bad reply, open failed!\n");			status=LOGINERROR;			return;	}	switch(firstrc){		case 1:			printf("get a unexpected reply, open failed!\n");			status=LOGINERROR;			return;		case 2:			status=LOGINED;			goto S;		case 3:			printf("get a unexpected reply, open failed!\n");			status=LOGINERROR;			return;		default:			printf("get a bad reply, open failed!\n");			status=LOGINERROR;			return;	}S:	firstrc=ftpcmd("SYST",NULL);	ftpcmd("FEAT",NULL);//many things hasn't finished in this func!	ftpcmd("PWD",NULL);	firstrc=ftpcmd("TYPE","A");	if( firstrc!=2 ){		printf( "negotiation for the transmition failed!\n" );		exit(0);	}}void dolist(char *arg){	int firstrc=ftpcmd("PASV",NULL);	if( firstrc!=2 ){		printf( "request for passive mode failed! list maybe wrong\n");	}	ftpcmd("LIST",arg);}void docd(char *arg){	ftpcmd("CWD",arg);}void doget(char *arg){	ftpcmd("TYPE","I");	ftpcmd("PASV",NULL);	printf("%s\n",arg);	ftpcmd("RETR",arg);}void doput(char * arg){	ftpcmd("TYPE","I");	ftpcmd("PASV",NULL);	printf("%s\n",arg);	ftpcmd("STOR",arg);}	void doerror(char *arg){	printf("the user command you have inputted doesn't exit!\n");}///////////////////////////////////////////main paser////////////////////////////////////////////////void parser(char *str){	char *cmd=malloc( sizeof(char)*10 );	char *arg=malloc( sizeof(char)*100 );	if( cmd==NULL || arg==NULL ){		perror("malloc failed!");	}	getcmdandarg( str , cmd , arg );	printf( "cmd:%s,arg:%s\n" , cmd , arg );	int num=cmdmappingnum(cmd);	printf("num:%d\n",num);	switch(num){		case OPEN:			doopen(arg);			break;		case quit:			doquit(arg);			break;		case LS:			dolist(arg);			break;		case CD:			docd(arg);			break;		case GET:			doget(arg);			break;		case PUT:			doput(arg);			break;		default:			doerror(arg);	}	printf("before free(cmd)\n");	free(cmd);	printf("after free(cmd)\n");	free(arg);	printf("after free(arg)\n");}

⌨️ 快捷键说明

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