第13章网络,Page672~674页,带进度的FTP下载的易错点及程序书写顺序

2024-01-21 08:28

本文主要是介绍第13章网络,Page672~674页,带进度的FTP下载的易错点及程序书写顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络篇,书上672~674页,带进度的FTP下载的的实例程序,写了两遍,才写成功,而且第二遍写的时候,对易错的地方有所感悟,写篇心得记下来。
首先上代码:

#include <curl/curl.h>
#include <iostream>
#include <fstream>
#include <sstream> //stringstreamusing namespace std;int to_size(char* data, size_t size, size_t nmemb, void* userdata)
{int result_code = 0;string s(data, size*nmemb);stringstream ss(s);ss >> result_code;if(!ss.bad() && result_code == 213){int* pcode = static_cast <int*> (userdata);ss >> *pcode;}return nmemb*size;
}int to_stream(char* data, size_t size, size_t nmemb, void* userdata)
{ostream& os = *static_cast <ostream*> (userdata);std::string line(data, size*nmemb);os << line;return size*nmemb;
}//当需要通知进度时,回调
int down_progress(void*, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
{if(dltotal == 0)return 0;int count = (dlnow * 1.0 / dltotal) * 50; //确定需要画多少个等号cout << (dlnow * 100 / dltotal) << "%"; //确定百分比for(int i = 0; i < count; ++i){cout << '=';}cout << endl;return 0;
}//取FTP服务器指定文件的大小
int get_server_file_size(string const& server_url, string const& username, string const& password, string const& pathfile)
{CURL* handle = curl_easy_init();curl_easy_setopt(handle, CURLOPT_URL, server_url.c_str());//username和password也需要C形式的字符串curl_easy_setopt(handle, CURLOPT_USERNAME, username.c_str());curl_easy_setopt(handle, CURLOPT_PASSWORD, password.c_str());string cmd = "SIZE " + pathfile; //SIZE后面要有个分号curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, cmd.c_str());int filesize = 0;curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, to_size);curl_easy_setopt(handle, CURLOPT_HEADERDATA, static_cast <void*> (&filesize));curl_easy_perform(handle);cout << "filesize = " << filesize << endl;curl_easy_cleanup(handle);return filesize;
}int main()
{curl_global_init(CURL_GLOBAL_DEFAULT);CURL* handle = curl_easy_init();ofstream ofs("a.zip", ios_base::out | ios_base::binary);if(!ofs){cerr << "无法打开本地文件a.zip。" << endl;return -1;}string server_url = "ftp://127.0.0.1:21/";string pathfile = "fengjie/meili/2.zip";string username = "d2school";string password = "123456";//取服务端指定文件大小size_t file_size = get_server_file_size(server_url, username, password, pathfile);//告诉libcurl待下载文件的总大小curl_easy_setopt(handle, CURLOPT_INFILESIZE_LARGE, static_cast <curl_off_t> (file_size));//开启进度通知curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0L);curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, down_progress);//设置如何处理下载的数据string url = server_url + pathfile;curl_easy_setopt(handle, CURLOPT_URL, url.c_str());
//    //username和password也需要C形式的字符串curl_easy_setopt(handle, CURLOPT_USERNAME, username.c_str());curl_easy_setopt(handle, CURLOPT_PASSWORD, password.c_str());//本次下载采用直接定位到文件的方式,类似于http协议的下载,不需要使用ftp命令: RETR 文件名curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, to_stream);curl_easy_setopt(handle, CURLOPT_WRITEDATA, static_cast <void*> (&ofs));curl_easy_perform(handle);//启动下载ofs.close();//关闭流curl_easy_cleanup(handle);curl_global_cleanup();return 0;
}


易错点分析:

65行,要注意SIZE后面要有个分号
62,63, 107,108行,要注意username和password不要忘了使用c_str()转化成“C”形式的字符串
110行,本次下载采用直接定位到文件的方式,类似于http协议的下载,不需要使用ftp命令: RETR 文件名
116行,关闭流,这个容易遗忘。不过这一行即使遗忘了,应该也不会有问题,因为ofs是栈变量,会自动回收内存。
写的过程要注意:不要一口气把整个程序写完,否则出了错,会花费老大劲去寻找错误。
首先,main函数中,写到96行,要测试一下,看看能不能得到文件的大小,如果不能得到,则停下来,排查错误。把错误解决完,再继续往下写。

接下来,先写104-112行的内容,看看能否把文件下载下来,若不能,则同样排查错误。把错误解决完,再继续写98-101行的内容,把下载进度通知加上。

这篇关于第13章网络,Page672~674页,带进度的FTP下载的易错点及程序书写顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628923

相关文章

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py