第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

相关文章

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线