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

📄 ftpclient.c

📁 Linux下C实现的ftp客户端代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(send_cmd(cmd_line,ftp_info) == -1){
		return -1;
	}
	if(recv_response(ftp_info) != 250){
		return -1;
	}

	return 0;
}

static int deal_cmd_get(char *filename,ftpc_ctrl *ftp_info)
{
	int retval = 0,fd;
	char cmd_to_server[64];
	char buffer[FTPC_MAX_DATA_LEN];

	if(ftp_info->open_mode == MODE_PASSIVE){
		if(go_passive(ftp_info) == -1){
			return -1;
		}
	}

	sprintf(cmd_to_server,"RETR %s\r\n",filename);
	if(send_cmd(cmd_to_server,ftp_info) == -1){
		return -1;
	}
	if(recv_response(ftp_info) != 150){
		return -1;
	}
	printf("%s\n",server_response);

	fd = open(filename,O_RDWR | O_CREAT | O_TRUNC,0666);
	do{
		retval = recv_data(buffer,ftp_info);
		if(retval > 0){
			write(fd,buffer,retval);
		}
	}while(retval > 0);

	first_recv = TRUE;
	close(ftp_info->data_fd);
	close(fd);
	ftp_info->data_fd = -1;
	
	return retval;
}

static int deal_cmd_put(char *filename,ftpc_ctrl *ftp_info)
{
	int retval = 0,fd,n_read;
	char cmd_to_server[64];
	char buffer[FTPC_MAX_DATA_LEN];
	struct stat st;

	if(access(filename,F_OK) == -1){
		printf("file[%s] not exist!\n",filename);
		return -1;
	}
	stat(filename,&st);
	if(!S_ISREG(st.st_mode)){
		printf("file[%s] not a common file!\n",filename);
		return -1;
	}
	if((st.st_mode & S_IRUSR) != S_IRUSR){
		printf("you do not have the permission of file[%s]\n",filename);
		return -1;		
	}

	if(ftp_info->open_mode == MODE_PASSIVE){
		if(go_passive(ftp_info) == -1){
			return -1;
		}
	}

	sprintf(cmd_to_server,"STOR %s\r\n",filename);
	if(send_cmd(cmd_to_server,ftp_info) == -1){
		return -1;
	}
	if(recv_response(ftp_info) != 150){
		return -1;
	}
	printf("%s\n",server_response);

	fd = open(filename,O_RDONLY);
	do{
		n_read = read(fd,buffer,1024);
		retval = send_data(buffer,ftp_info,n_read);
	}while((n_read > 0)&&(retval > 0));
	first_recv = TRUE;
	close(ftp_info->data_fd);
	close(fd);
	recv_response(ftp_info);
	ftp_info->data_fd = -1;
	
	return retval;
}

static int deal_cmd_pwd(ftpc_ctrl *ftp_info)
{
	send_cmd("PWD\r\n",ftp_info);
	if(recv_response(ftp_info) != 257){
		return -1;
	}
		
	return 0;	
}

static int deal_cmd_quit(ftpc_ctrl *ftp_info)
{
	send_cmd("QUIT\r\n",ftp_info);
	if(recv_response(ftp_info) != 221){
		ftp_info->connected = FALSE;
		return -1;
	}
	
	ftp_info->connected = FALSE;	
	return 0;
}

static int deal_cmd_bye(ftpc_ctrl *ftp_info)
{
	send_cmd("QUIT\r\n",ftp_info);
	if(recv_response(ftp_info) != 221){
		ftp_info->connected = FALSE;
		return -1;
	}
	
	ftp_info->connected = FALSE;	
	return 0;
}

int ftpc_init(ftpc_ctrl *ftp_info)
{
	if(ftp_info == NULL){
		return -1;
	}

	chdir(DEFAULT_LOCAL_MENU);
	ftp_info->open_mode = MODE_PASSIVE;
	ftp_info->connected = FALSE;
	ftp_info->ctrl_fd = socket(AF_INET,SOCK_STREAM,0);
	ftp_info->data_fd = -1;

	return 0;
}

int ftpc_connect_svr(char *svr_ip,uint16 svr_port,ftpc_ctrl *ftp_info)
{
	int count,retval;
	struct sockaddr_in sa;

	if((svr_ip == NULL) || (ftp_info == NULL)){
		return -1;
	}
	printf("connect to server......\n");
	
	memset(&sa,0,sizeof(sa));
	sa.sin_family = AF_INET;
	sa.sin_port = htons(svr_port);
	sa.sin_addr.s_addr = inet_addr(svr_ip);

	ftp_info->connected = FALSE;
	setlock(ftp_info->ctrl_fd,FALSE);
	for(count=0;count<FTPC_CONNECT_AGAIN_COUNT;count++){
		retval = connect(ftp_info->ctrl_fd,(struct sockaddr *)&sa,sizeof(sa));
		if(retval == 0){
			break;
		}
		if(retval == -1){
			if(errno == 115){
				continue;
			}
			else{
				return -1;
			}
		}
	}
	setlock(ftp_info->ctrl_fd,TRUE);
	
	if(count<FTPC_CONNECT_AGAIN_COUNT){
		 if(recv_response(ftp_info) == 220){
			 printf("%s\n",server_response);	 
			ftp_info->connected = TRUE;	
			return 0;
		 }
		 else{
			printf("the server may be shuted down,please try later!\n");
		 }
	}	
	return -1;
}

int ftpc_login_svr(char *usr_name,char *usr_passwd,ftpc_ctrl *ftp_info)
{
	char name_buf[32];
	char passwd_buf[32];
	int res_code;

	if((usr_name == NULL) || (usr_passwd == NULL) || (ftp_info == NULL)){
		return -1;
	}

	sprintf(name_buf,"USER %s\r\n",usr_name);	
	send_cmd(name_buf,ftp_info);
	if(recv_response(ftp_info) == -1){
		return -1;
	}
	else{
		printf("%s\n",server_response);
		res_code = get_res_code();
		if(res_code != 331){
			return -1;
		}
	}
	
	sprintf(passwd_buf,"PASS %s\r\n",usr_passwd);
	send_cmd(passwd_buf,ftp_info);
	if(recv_response(ftp_info) == -1){
		return -1;
	}
	else{
		printf("%s\n",server_response);
		res_code = get_res_code();
		if(res_code != 230){
			return -1;
		}
	}
	return 0;
}

int ftpc_deal_cmd(char *cmd,char *param,ftpc_ctrl *ftp_info,char *msg_to_user)
{
	if((cmd == NULL) || (msg_to_user == NULL)){
		return -1;
	}
	
	if(strcmp(cmd,"lcd") == 0){
		if(deal_cmd_lcd(param,ftp_info) == -1){
			strcpy(msg_to_user,server_response);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"bye") == 0){
		if(deal_cmd_bye(ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	
	if(strcmp(cmd,"quit") == 0){
		if(deal_cmd_quit(ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}


	if(strcmp(cmd,"pwd") == 0){
		if(deal_cmd_pwd(ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"help") == 0){
		ftpc_help();
		strcpy(msg_to_user,server_response);
		return 0;	
	}

	if((strcmp(cmd,"ls") == 0) || (strcmp(cmd,"dir") == 0)){
		if(deal_cmd_ls(ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"get") == 0){
		if(deal_cmd_get(param,ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"put") == 0){
		if(deal_cmd_put(param,ftp_info) == -1){
			strcpy(msg_to_user,server_response);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"cd") == 0){
		if(deal_cmd_cd(param,ftp_info) == -1){
			strcpy(msg_to_user,server_response);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"del") == 0){
		if(deal_cmd_del(param,ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"mkdir") == 0){
		if(deal_cmd_mkdir(param,ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"rmdir") == 0){
		if(deal_cmd_rmdir(param,ftp_info) == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}

	if(strcmp(cmd,"localshow") == 0){
		if(deal_cmd_lcshow() == -1){
			sprintf(msg_to_user,"command \"%s\" implement error",cmd);
			return -1;
		}
		else{
			strcpy(msg_to_user,server_response);
			return 0;
		}
	}	

	sprintf(msg_to_user,"what???I don't recognize the command[%s]!please input \"help\"!",cmd);
	return -1;

}

int ftpc_close(ftpc_ctrl *ftp_info)
{
	if(ftp_info == NULL){
		return -1;
	}

	ftp_info->connected = FALSE;

	if(ftp_info->ctrl_fd){
		shutdown(ftp_info->ctrl_fd,2);
		close(ftp_info->ctrl_fd);
		ftp_info->ctrl_fd = -1;
	}
	
	if(ftp_info->data_fd){
		shutdown(ftp_info->data_fd,2);
		close(ftp_info->data_fd);
		ftp_info->data_fd = -1;
	}

	return 0;
}


⌨️ 快捷键说明

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