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

📄 controlmodule.c

📁 自己写的一个ftp client
💻 C
字号:
#include"global.h"#include"controlmodule.h"#include"datatransmitmodule.h"///////////////////////////ftp command////////////////////#define ERROR 0#define USER 1#define PASS 2#define SYST 3#define FEAT 4#define PWD 5#define TYPE 6#define PASV 7#define LIST 8#define CWD 9#define RETR 10#define STOR 11#define ACCT 12#define QUIT 13////////////////////map strFTPcmd to intFTPcmd////////////////int ftpcmdmapping( char * cmd ){	if( strcmp( cmd , "USER") ==0 ){		return USER;	}else if( strcmp( cmd , "PASS" )==0 ){		return PASS;	}else if( strcmp( cmd , "SYST" )==0 ){		return SYST;	}else if( strcmp( cmd , "FEAT" )==0){		return FEAT;	}else if( strcmp( cmd , "PWD" )==0){		return PWD;	}else if( strcmp( cmd , "TYPE")==0 ){		return TYPE;	}else if( strcmp( cmd , "PASV" )==0 ){		return PASV;	}else if( strcmp( cmd , "LIST" )==0 ){		return LIST;	}else if( strcmp( cmd , "CWD" )==0 ){		return CWD;	}else if( strcmp( cmd , "RETR" )==0 ){		return RETR;	}else if( strcmp( cmd , "STOR" )==0 ){		return STOR;	}else if( strcmp( cmd , "ACCT" )==0 ){		return ACCT;	}else if( strcmp( cmd , "QUIT" )==0 ){		return QUIT;	}		return ERROR;}int addcrlf(char *str){//return the bytes of the already buf.	int c=0;	while( *str!='\0' ){		str++;		c++;	}	*(str++)='\15';	*(str++)='\12';	*str='\0';	c+=2;	return c;}int getFirstReplyCode(char *str){	return (int)*str-48;}int getPortnum(char *str){	int c=0;	char * p=str;	int n1=0,n2=0;	while(c!=4){		if(*p==','){			c++;		}		p++;	}	while( (int)*p>47 && (int)*p<58 ){		n1+=(int)*p-48;		n1*=10;		p++;	}	n1/=10;	p++;	while( (int)*p>47 && (int)*p<58 ){		n2+=(int)*p-48;		n2*=10;		p++;	}	n2/=10;	printf("n1=%d,n2=%d\n",n1,n2);	return n1*256+n2;}///////////////////the following function do all the really job for ftp request and response//////////int ftpuser( char * arg){//	char *cmdbuf =malloc( sizeof(char)*100 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"USER ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpuser()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf);	int n= getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}int ftppassword( char * arg){//	char *cmdbuf =malloc( sizeof(char)*2048 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"PASS ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftppassword()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}int ftpsystem(char *arg){//	char *cmdbuf =malloc( sizeof(char)*50 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"SYST");	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpsystem()->write()\n");	}	readline(controlfd,cmdbuf);	strcpy(remoteostype,cmdbuf->buf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	free(cmdbuf);	return n;}int ftpfeature(char *arg){//	char *cmdbuf =malloc( sizeof(char)*100 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"FEAT");	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpfeature()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}int ftpprintworkingdirectory(char * arg){//	char *cmdbuf =malloc( sizeof(char)*100 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"PWD");	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpprintworkingdirectory()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	char *ptr1=cmdbuf->buf;	char *ptr2;	while( *ptr1!='"' ){		ptr1++;	}	ptr2=++ptr1;	while( *ptr1!='"' ){		ptr1++;	}	*ptr1='\0';	strcpy( remotecwd , ptr2 );//	printf( "%s\n" , ptr2 );	freelinebuf(cmdbuf);	return n;}int ftptype(char *arg){//	char *cmdbuf =malloc( sizeof(char)*500 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"TYPE ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftptype()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	if( n==2 ){		*transmittype=*arg;	}	freelinebuf(cmdbuf);	return n;}int ftppassive(char * arg){//	char *cmdbuf =malloc( sizeof(char)*1000 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	struct sockaddr_in remote;	bzero( &remote , sizeof(struct sockaddr_in) );	remote.sin_family=AF_INET;	inet_pton( AF_INET , remoteaddr , &remote.sin_addr.s_addr );		strcpy(cmdbuf->buf,"PASV");	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftppassive()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int port=getPortnum(cmdbuf->buf);	remote.sin_port=htons(port);	datafd=socket( AF_INET , SOCK_STREAM , 0 );	if( datafd==-1){		perror("ftppassive()->socket()\n");	}	if( connect( datafd , (struct sockaddr*)&remote , sizeof(remote) ) ==-1 ){		perror("ftppassive()->connect()\n");	}	int n=getFirstReplyCode(cmdbuf->buf);	printf("free(cmdbuf) in ftppassive()!\n");	freelinebuf(cmdbuf);	return n;}int ftplist(char  * arg){//	char *cmdbuf =malloc( sizeof(char)*500 );	struct linebuf* cmdbuf=inilinebuf(100);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}//	char *listbuf;	struct linebuf* listbuf;	if(*arg!='\0'){		strcpy(cmdbuf->buf,"LIST ");		strcpy(cmdbuf->buf+5,arg);	}else{		strcpy(cmdbuf->buf,"LIST");	}	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftplist()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	if(n==1){//		listbuf=malloc( sizeof(char)*3000 );		listbuf=inilinebuf(4096);		if( listbuf==NULL ){			perror("malloc failed!\n");		}		if( readlist( datafd , listbuf ) <=0 ){			perror("ftplist()->readlist()!");		}		printf("%s\n",listbuf->buf);		close(datafd);		readline(controlfd,cmdbuf);		freelinebuf(listbuf);		printf("%s\n",cmdbuf->buf);		freelinebuf(cmdbuf);		return n;	}	freelinebuf(cmdbuf);	return n;}int ftpchangeworkingdirectory(char * arg){//	char *cmdbuf =malloc( sizeof(char)*50 );	struct linebuf* cmdbuf=inilinebuf(50);	if( cmdbuf==NULL ){		perror("malloc failed!\n");	}//	char *listbuf;	struct linebuf* listbuf;	if(*arg!='\0'){		strcpy(cmdbuf->buf,"CWD ");		strcpy(cmdbuf->buf+4,arg);	}else{		strcpy(cmdbuf->buf,"CWD");	}	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpchangingworkingdirectory()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}int ftpretrive(char *arg){	printf("enter ftpretrive()\n");//	char *cmdbuf =malloc( sizeof(char)*200 );	struct linebuf* cmdbuf=inilinebuf(200);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"RETR ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpretrive()->write()\n");	}	int n;R:	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	n=getFirstReplyCode(cmdbuf->buf);	switch(n){		case 1:			readdata(datafd,arg);			close(datafd);			goto R;		case 2:			break;		default:			return n;	}	printf("before free()\n");	freelinebuf(cmdbuf);	printf("after free()\n");	return n;}int ftpstore(char * arg){	printf("enter ftpstore()\n");//	char *cmdbuf =malloc( sizeof(char)*200 );	struct linebuf* cmdbuf=inilinebuf(200);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"STOR ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpstore()->write()\n");	}T:	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	switch(n){		case 1:			writedata(datafd,arg);			close(datafd);			goto T;		case 2:			break;		default:			return n;	}	freelinebuf(cmdbuf);	return n;}int ftpaccount(char *arg){//	char *cmdbuf =malloc( sizeof(char)*500 );	struct linebuf* cmdbuf=inilinebuf(500);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"ACCT ");	strcpy(cmdbuf->buf+5,arg);	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftpaccount()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}int ftpquit(char *arg){//	char *cmdbuf =malloc( sizeof(char)*50 );	struct linebuf* cmdbuf=inilinebuf(50);	if( cmdbuf==NULL){		perror("malloc failed!\n");	}	strcpy(cmdbuf->buf,"QUIT");	int count=addcrlf(cmdbuf->buf);	printf("ftpcmd:");	for(int i=0;i<count;i++){		printf("%d ",*(cmdbuf->buf+i) );	}	if( write(controlfd,cmdbuf->buf,count)== -1){		perror("ftptquit()->write()\n");	}	readline(controlfd,cmdbuf);	printf("%s\n",cmdbuf->buf);	int n=getFirstReplyCode(cmdbuf->buf);	freelinebuf(cmdbuf);	return n;}	int ftperror( char *arg){	printf("giving a wrong ftpcmd!\n");	exit(0);}///////////////////the global function in the controling module///////////////////////////////////////int ftpcmd(char *cmd,char *arg){	int num=ftpcmdmapping(cmd);	switch(num){		case USER:			return ftpuser(arg);		case PASS:			return ftppassword(arg);		case SYST:			printf("enter SYST\n");			return ftpsystem(arg);		case FEAT:			printf("enter FEAT\n");			return ftpfeature(arg);		case PWD:			return ftpprintworkingdirectory(arg);		case TYPE:			return ftptype(arg);		case PASV:			return ftppassive(arg);		case LIST:			return ftplist(arg);		case CWD:			return ftpchangeworkingdirectory(arg);		case RETR:			return ftpretrive(arg);		case STOR:			return ftpstore(arg);		case ACCT:			return ftpaccount(arg);		case QUIT:			return ftpquit(arg);		default:			ftperror(arg);	}	return ERROR;//never goto here!}

⌨️ 快捷键说明

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