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

📄 client.c

📁 linux下RFC 959 FTP客户端程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		if(chdir(dir)<0)			printf("invalid dir\n");		else			printf("lcd seccessed! local dir=%s\n",dir);	}}void help(){	printf("\033[1;40;34m%s\033[0m","help --List the commmand infomation.\n");		printf("\033[1;40;34m%s\033[0m","cd   --Change remote working directory.\n");		printf("\033[1;40;34m%s\033[0m","lcd  --Change local working directory.\n");		printf("\033[1;40;34m%s\033[0m","ls   --List contents of remote directory.\n");		printf("\033[1;40;34m%s\033[0m","pwd  --Print working directory on remote machine.\n");		printf("\033[1;40;34m%s\033[0m","lpwd --Print working directory on local machine.\n");		printf("\033[1;40;34m%s\033[0m","bye  --Terminate ftp session and exit.\n");		printf("\033[1;40;34m%s\033[0m","mode --Change the mode.\n");		printf("\033[1;40;34m%s\033[0m","get  --Receive file.\n");		printf("\033[1;40;34m%s\033[0m","put  --Send one file.\n");		printf("\033[1;40;34m%s\033[0m","!    --Execute a local command.\n");		puts ("");}void ftp_cmd_filename(char * usr_cmd, char * src_file, char * dst_file){		int length,  flag = 0;	int i = 0, j = 0;	char * cmd_src;	cmd_src = strchr(usr_cmd, ' ');	if(cmd_src == NULL)	{		printf("command error!\n");		return;	}	else	{		while(*cmd_src == ' ')			cmd_src ++;	}	if(cmd_src == NULL || cmd_src == '\0')	{		printf("command error!\n");	}	else	{			length = strlen(cmd_src);		while(i <= length)//be careful with space in the filename		{				if((*(cmd_src+i)) !=' ' && (*(cmd_src+i)) != '\\')			{				if(flag == 0)					src_file[j] = *(cmd_src +i);				else					dst_file[j] = *(cmd_src +i);				j++;			}			if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) !=' ')			{				if(flag == 0)					src_file[j] = *(cmd_src +i);				else					dst_file[j] = *(cmd_src +i);				j++;			}			if((*(cmd_src+i)) == ' ' && (*(cmd_src+i-1)) != '\\')			{				src_file[j] = '\0';				flag = 1;				j = 0;			}			if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) == ' ')			{				if(flag == 0)					src_file[j] = ' ';				else					dst_file[j] = ' ';				j++;			}			i++;		};	}	if(flag == 0)		strcpy(dst_file, src_file);	else		dst_file[j] = '\0';}void ftp_cd(char *usr_cmd){	char *begin=strchr(usr_cmd,' ');	char dir[1024];	if(begin==NULL)	{		puts("command error!");		return ;	}	else	{		while(*begin==' ')			begin++;	}	if(begin==NULL||begin=='\0')	{		puts("command error!");		return ;	}	else	{		strncpy(dir,begin,strlen(begin));		dir[strlen(begin)]='\0';		ftp_send_cmd("CWD ",dir,sock_control);		ftp_get_reply(sock_control);	}}void user_mode(){	mode=(mode+1)%2;	if(mode==1)		puts("Now in PASV mode");	else 		puts("Now in PORT mode");	return ;}ftp_get(char*usr_cmd){	int get_sock, set, new_sock, i = 0;	char src_file[512];	char dst_file[512];	char rcv_buf[512];	char cover_flag[3];	struct stat file_info;	int local_file;	int count = 0;	ftp_cmd_filename(usr_cmd, src_file, dst_file);	if(!stat(dst_file, &file_info))	{		printf("local file %s exists: %d bytes\n", dst_file, (int)file_info.st_size);		printf("Do you want to cover it? [y/n]");		fgets(cover_flag, sizeof(cover_flag), stdin);		fflush(stdin);		if(cover_flag[0] != 'y')		{			printf("get file %s aborted.\n", src_file);			return;		}	}	local_file = open(dst_file, O_CREAT|O_TRUNC|O_WRONLY);	if(local_file < 0)	{		printf("creat local file %s error!\n", dst_file);		return;	}	get_sock = xconnect_ftpdata();	if(get_sock < 0)	{		printf("socket error!\n");		return;	}	set = sizeof(local_host);		ftp_send_cmd("TYPE I", NULL, sock_control);	ftp_get_reply(sock_control);	ftp_send_cmd("RETR ", src_file, sock_control);	if(!mode)	{		while(i < 3)		{			new_sock = accept(get_sock, (struct sockaddr *)&local_host, \				(socklen_t *)&set);			if(new_sock == -1)			{				printf("accept return:%s errno: %d\n", strerror(errno),errno);				i++;				continue;			}				else break;		}		if(new_sock == -1)		{			printf("Sorry, you can't use PORT mode. \n");			return;		}		ftp_get_reply(sock_control);		while(1)		{			printf("read data from data socket\n");			count = read(new_sock, rcv_buf, sizeof(rcv_buf));			if(count <= 0)				break;			else			{				write(local_file, rcv_buf, count);			}		}		close(local_file);		close(get_sock);		close(new_sock);		ftp_get_reply(sock_control); 	}	else	{		ftp_get_reply(sock_control);		while(1)		{			count = read(get_sock, rcv_buf, sizeof(rcv_buf));			if(count <= 0)				break;			else			{				write(local_file, rcv_buf, count);			}		}	close(local_file);	close(get_sock);	ftp_get_reply(sock_control); 	}	ftp_get_reply(sock_control); }void ftp_put(char*usr_cmd){	char src_file[512],dst_file[512];	char send_buff[512];	struct stat file_info;	int local_file;	int file_put_sock,new_sock,count=0,i=0;	int set=sizeof(local_host);	ftp_cmd_filename(usr_cmd,src_file,dst_file);	if(stat(src_file,&file_info)<0)	{		printf("local file %s doesn't exist!\n",src_file);		return;	}	local_file=open(src_file,O_RDONLY);	if(local_file<0)	{		puts("Open file error");		return ;	}	file_put_sock=xconnect_ftpdata();	if(file_put_sock<0)	{		ftp_get_reply(sock_control);		puts("Creat data socket error");		return;	}	ftp_send_cmd("STOR ",dst_file,sock_control);	ftp_get_reply(sock_control);	ftp_send_cmd("TYPE I",NULL,sock_control);	ftp_get_reply(sock_control);	if(mode==0)	{		while(i<3)		{			new_sock=accept(file_put_sock,(struct sockaddr *)&local_host,(socklen_t*)&set);			if(new_sock==-1)			{				puts("error create new_sock in put port");				i++;				continue ;			}			else 				break;		}		if(new_sock==-1)		{			puts("The PORT mode won't work");			return;		}		while(1)		{			count=read(local_file,send_buff,sizeof(send_buff));			if(count<=0)				break;			else			{				write(new_sock,send_buff,sizeof(send_buff));			}			close(local_file);			close(file_put_sock);			close(new_sock);		}	}	if(mode==1)	{		while(1)		{			count=read(local_file,send_buff,sizeof(send_buff));			if(count<=0)				break;			else			{				write(file_put_sock,send_buff,count);			}		}		close(local_file);		close(file_put_sock);	}	ftp_get_reply(sock_control);}void local_ls(char *usr_cmd){	char *temp =strchr(usr_cmd,'!');	system(temp+1);	return ;}int run(char * server_ip,int port){	int error;	int cmd_flag;	char user_cmd[1024];	error=fill_host_addr(server_ip,&ftp_server,port);	if(error==254)		cmd_err_exit("Invalid port!",254);	if(error==253)		cmd_err_exit("Invalid address!",253);	sock_control=xconnect(&ftp_server,1); //建立控制通道	if((error=ftp_get_reply(sock_control))!=220)//对新用户准备好		cmd_err_exit("Connect error!",220);	error=ftp_login();	while (error!=1)//登录	{		error=ftp_login();	}	while(1)        //用户交互开始	{		printf("ftp> ");		fgets(user_cmd,510,stdin);		fflush(stdin);//清除输入缓冲区		if(user_cmd[0]=='\n')			continue;		user_cmd[strlen(user_cmd)-1]='\0';		cmd_flag=ftp_usr_cmd(user_cmd);		switch (cmd_flag)		{			case 1:				ftp_list();				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 2:				ftp_pwd();				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 3:				ftp_cd(user_cmd);				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 4:				ftp_put(user_cmd);				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 5:				ftp_get(user_cmd);				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 6:				ftp_bye();				memset(user_cmd,'\0',sizeof(user_cmd));				exit(0);				break;			case 7:				user_mode();				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 8:				local_ls(user_cmd);				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 12:				local_pwd();				memset(user_cmd,'\0',sizeof(user_cmd));				break;			case 13:				local_cd(user_cmd);				memset(user_cmd,'\0',sizeof(user_cmd));				break;			default:				help();				memset(user_cmd,'\0',sizeof(user_cmd));				break;		}	}}int main(int argc,char *argv[]){	//fill_host_addr(argv[1],&ftp_server,(int)atoi(argv[2]));	//get_user();	//get_pass();	//xconnect(&ftp_server,1);	if(argc!=2&&argc!=3)	{		printf("Usage:%s [host[port]]",argv[0]);		exit(1);	}	else	{		if(argv[2]==NULL)			run(argv[1],21);		else			run(argv[1],atoi(argv[2]));	}	return 0;}

⌨️ 快捷键说明

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