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

📄 ftpclient.c

📁 linux下编程实现的基本FTP
💻 C
字号:
#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <strings.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include "ftp.h"#define SERVER_CTRL_PORT	21#define MAX_INFO 1024#define CMD_BUF_LEN 100int  ftp_Control_sock;char server_Control_Info[MAX_INFO];char server_Data_Info[MAX_INFO];char user_cmd_info[CMD_BUF_LEN];char format_cmd_info[CMD_BUF_LEN];char file_name_info[CMD_BUF_LEN];void get_Server_Control_Info(char* cmd,int length){	int len;	if(length!=0)   	{   	len = write(ftp_Control_sock, cmd, length);		printf("%d bytes writen %s\n", len,cmd);	}		memset(server_Control_Info, 0, MAX_INFO);		int bytes;	if((bytes=recv(ftp_Control_sock,server_Control_Info,MAX_INFO,0))==-1)	{		printf("recv error\n");		exit(-1);	}	server_Control_Info[bytes]='\0';	printf("Server Message:\n%s\n",server_Control_Info);}struct sockaddr_in get_Server_Data_Port(){	    struct sockaddr_in dataSock;	 char *sc;	 char ip[16];	 char cport[4];	 int port;	 int flag=0; 	 int ipnum=0;	 int ipt=0;	 int portnum=0;	 int portt=0;	 for (sc =server_Control_Info; *sc != '\0'; ++sc)	  {	  	if(flag==2)	  	{	  		if(*sc==','||*sc==')')	  		{	  			cport[portnum]='\0';	  			port=port*portt+atoi(cport);	  			portt=256;	  			portnum=0;	  		}	  		else if(*sc!=',')	  		{	  			cport[portnum]=*sc;	  			portnum++;	  		}	  	}	  	if(flag==1)	  	{	  		if(*sc!=',')	  		{	  			ip[ipnum]=*sc;	  		}	  		else 	  		{	  			ipt++;	  			if(ipt<4)ip[ipnum]='.';		  			else 	  			{	  				flag=2;	  				ip[ipnum]='\0';	  			}	  		}	  		ipnum++;	  	}	  	if(*sc=='(')flag=1;	  	if(*sc==')')break;	  }    bzero(&dataSock, sizeof(dataSock));	 dataSock.sin_family = AF_INET;	 dataSock.sin_port = htons(port);	 if(inet_pton(AF_INET,ip, &dataSock.sin_addr)<=0)	  {		printf("IP address invalid!\n");		exit(-1);	 }	 return dataSock;}void get_Server_Data_Info(char* cmd,int length){	char pasv_cmd[7]="pasv\r\n"; 	get_Server_Control_Info(pasv_cmd,strlen(pasv_cmd));   struct sockaddr_in data_Temp_addr=get_Server_Data_Port();   int ftp_data_sock;   if ((ftp_data_sock=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		fprintf(stderr,"Socket Create Error:%s\a\n",strerror(errno));		exit(1);
	}   if(connect(ftp_data_sock, (struct sockaddr*)(&data_Temp_addr), sizeof(struct sockaddr_in)) < 0)    	{		printf("connection failed!\n");		exit(-1);    	}   if (strncmp("dir", cmd, 3) == 0)    	{    	   char list_cmd[7]="list\r\n";     	   get_Server_Control_Info(list_cmd,strlen(list_cmd));    		int cmd_sock=fileno(stdout);    		int n;     		memset(server_Data_Info, 0, MAX_INFO);	    		while ((n = read(ftp_data_sock, server_Data_Info, MAX_INFO)) > 0)			{	    			if (write(cmd_sock, server_Data_Info, n) != n)	    				{						printf("read from server error in get_server_data\n");						return;	  				 }			}				close(ftp_data_sock);						get_Server_Control_Info(list_cmd,0);    	}    	/////////////////////////////////////////   if (strncmp("retr", cmd, 4) == 0)    	{    		char type_cmd[9]="TYPE I\r\n";    	   get_Server_Control_Info(type_cmd,strlen(type_cmd));    	       	   get_Server_Control_Info(cmd,strlen(cmd));    	       	   FILE* fp = fopen(file_name_info, "ab");	    	if (fp == NULL)	    		{					printf("open file %s error\n",file_name_info);					return;	    		}    		int cmd_sock=fileno(fp);    		int n;     		memset(server_Data_Info, 0, MAX_INFO);	    		while ((n = read(ftp_data_sock, server_Data_Info, MAX_INFO)) > 0)			{	    			if (write(cmd_sock, server_Data_Info, n) != n)	    				{						printf("read from server error in get_server_data\n");						return;	  				 }			}			fclose(fp);			close(ftp_data_sock);			get_Server_Control_Info(cmd,0);			char transter[]="226 ";			while(strstr(server_Control_Info,transter)==NULL)				get_Server_Control_Info(cmd,0);    	}   if (strncmp("stor", cmd, 4) == 0)    	{    	   char type_cmd[9]="TYPE I\r\n";    	   get_Server_Control_Info(type_cmd,strlen(type_cmd));    	   FILE* fp = fopen(file_name_info, "rb");	    	if (fp == NULL)	    		{					printf("open file %s error\r\n",file_name_info);					close(ftp_data_sock);					return;	    		}	    	get_Server_Control_Info(cmd,strlen(cmd));    		int cmd_sock=fileno(fp);    		int n;     		memset(server_Data_Info, 0, MAX_INFO);	    		while ((n = read(cmd_sock, server_Data_Info, MAX_INFO)) > 0)			{	    			if (write(ftp_data_sock, server_Data_Info, n) != n)	    				{						printf("read from server error in get_server_data\n");						return;	  				 }			}			fclose(fp);			close(ftp_data_sock);			get_Server_Control_Info(cmd,0);			char transter[]="226 ";			while(strstr(server_Control_Info,transter)==NULL)				get_Server_Control_Info(cmd,0);    	}  // close(ftp_data_sock);}int main(int argc,char *argv[]){	struct sockaddr_in servaddr,localaddr;	/*************************************************************//*	      				 建立tcp连接 				      *//*************************************************************/		 	if(argc != 4)    	{		printf("Useage: %s <IP address> user password\n",argv[0]);		exit(-1);    	}		if ((ftp_Control_sock=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		fprintf(stderr,"Socket Create Error:%s\a\n",strerror(errno));		exit(1);
	}	bzero(&servaddr, sizeof(servaddr));	servaddr.sin_family = AF_INET;	servaddr.sin_port = htons(SERVER_CTRL_PORT);	if(inet_pton(AF_INET,argv[1], &servaddr.sin_addr)<=0)	{		printf("IP address invalid!\n");		exit(-1);	}	if(connect(ftp_Control_sock, (struct sockaddr*)(&servaddr), sizeof(struct sockaddr_in)) < 0)        {		printf("Connection failed!\n");		exit(-1);    	}   printf("Connected to host %s successfully\n", argv[1]);   	   int bytes;/*************************************************************//*	       接收ftp的welcome message			  *//*************************************************************/		if((bytes=recv(ftp_Control_sock,server_Control_Info,MAX_INFO,0))==-1)	{		printf("recv error\n");		exit(-1);	}	server_Control_Info[bytes]='\0';	printf("Server Message:%s\n",server_Control_Info);	/*************************************************************//*	                        			登录 					*//*************************************************************/	   //int lolen;   char loginbuf[CMD_BUF_LEN];   snprintf(loginbuf, CMD_BUF_LEN, "USER %s\r\n", argv[2]);   get_Server_Control_Info(loginbuf,strlen(loginbuf));   snprintf(loginbuf, CMD_BUF_LEN, "PASS %s\r\n", argv[3]);   get_Server_Control_Info(loginbuf,strlen(loginbuf));		while(1)	{/*************************************************************//*	                        接收命令输入 		 				*//*************************************************************/			printf("ftp>");		memset(user_cmd_info, 0, CMD_BUF_LEN);    	if (fgets(user_cmd_info, CMD_BUF_LEN, stdin) == NULL)		   		{			printf("user input error\n");			return -1;    		}	    		    	if (strncmp("pwd", user_cmd_info, 3) == 0)    		{    		   char pwd_cmd[6]="pwd\r\n";     			get_Server_Control_Info(pwd_cmd,strlen(pwd_cmd));    		}    	if (strncmp("quit", user_cmd_info, 4) == 0)    		{    		   char quit_cmd[7]="quit\r\n";     			get_Server_Control_Info(quit_cmd,strlen(quit_cmd));    			exit(-1);    		}    	if (strncmp("?", user_cmd_info, 1) == 0)    		{    		   int i=0;    		   for(i=0;i<COMMAND_NUM;i++)    		   		{    		   			printf("%s\n",clientCommand[i]);    		   		}    		}    	if(strncmp("dir",user_cmd_info,3)  == 0)    		{    			char dir_cmd[6]="dir\r\n";     			get_Server_Data_Info(dir_cmd,strlen(dir_cmd));    		}    	if(strncmp("cd",user_cmd_info,2)  == 0)    		{    			int ti=0;     		   int length=strlen(user_cmd_info);     			format_cmd_info[0]='c';				format_cmd_info[1]='w';				format_cmd_info[2]='d';				format_cmd_info[3]=' ';				for(ti=3;ti<length;ti++)					format_cmd_info[ti+1]=user_cmd_info[ti];				format_cmd_info[ti]='\r';				format_cmd_info[ti+1]='\n';				format_cmd_info[ti+2]='\0';		    			get_Server_Control_Info(format_cmd_info,length+3);    		}    	if(strncmp("get",user_cmd_info,3)  == 0)    		{    			int ti=0;     		   int length=strlen(user_cmd_info);     			format_cmd_info[0]='r';				format_cmd_info[1]='e';				format_cmd_info[2]='t';				format_cmd_info[3]='r';				format_cmd_info[4]=' ';				for(ti=4;ti<length;ti++)				{					format_cmd_info[ti+1]=user_cmd_info[ti];					file_name_info[ti-4]=user_cmd_info[ti];				}				file_name_info[ti-5]='\0';				format_cmd_info[ti]='\r';				format_cmd_info[ti+1]='\n';				format_cmd_info[ti+2]='\0';			    			get_Server_Data_Info(format_cmd_info,length+3);    		}      if(strncmp("put",user_cmd_info,3)  == 0)    		{    			int ti=0;     		   int length=strlen(user_cmd_info);            			format_cmd_info[0]='s';				format_cmd_info[1]='t';				format_cmd_info[2]='o';				format_cmd_info[3]='r';				format_cmd_info[4]=' ';				for(ti=4;ti<length;ti++)				{					format_cmd_info[ti+1]=user_cmd_info[ti];					file_name_info[ti-4]=user_cmd_info[ti];				}				file_name_info[ti-5]='\0';				format_cmd_info[ti]='\r';				format_cmd_info[ti+1]='\n';				format_cmd_info[ti+2]='\0';			    			get_Server_Data_Info(format_cmd_info,length+3);    		}    				}	close(ftp_Control_sock);	}

⌨️ 快捷键说明

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