libcurl 在下载文件时输出额外的尾随字节
libcurl outputting extra trailing bytes when downloading file
我在使用 libcurl
时遇到了一些奇怪的问题。从本质上讲,从 HTTP 服务器下载文件时,它会在文件末尾输出一些垃圾字节。尽管文件 应该 为 1,710,017 字节,但库改为写入 1,712,128,即多 2,111。我怀疑这是某种缓冲问题,因为后一个数字是 2^12 的倍数(和 2^13,但在其他情况下它符合 2^12 的倍数)。额外的数据要么是从文件的另一部分读取的相应字节数(它似乎每次只从 4 个地址之一读取,一直到最后),或者在一种情况下字节 CD
重复 2,111次。
相关代码:
std::string url; // defined elsewhere
FILE* data; // initialized elsewhere with option "wb"
CURL* query = curl_easy_init();
curl_easy_setopt(query, CURLOPT_WRITEDATA, data);
curl_easy_setopt(query, CURLOPT_URL, url);
curl_easy_setopt(query, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(query, CURLOPT_SSL_VERIFYPEER, false);
CURLcode res = curl_easy_perform(query);
此外:使用简单的写回调时会出现同样的问题,并且任何给定的远程服务器都会出现该问题,而不仅仅是这个特定的服务器。
编辑 #1: 我只能在 Windows 上复制它(在具有相同库文件的两台机器上测试)。它适用于 Debian。
编辑 #2: 当 libcurl
在我的笔记本电脑上构建时也会发生。为了提供额外的上下文,我在 Windows 10.
上使用 VC14 环境从 Marc Hörsken 的 ZIP(可从官方 curl 下载页面获得)构建
我将其归因于一些奇怪的 VC 错误或其他异常行为。重写问题代码以使用 fstream
而不是 FILE
就成功了。
我在使用 libcurl
时遇到了一些奇怪的问题。从本质上讲,从 HTTP 服务器下载文件时,它会在文件末尾输出一些垃圾字节。尽管文件 应该 为 1,710,017 字节,但库改为写入 1,712,128,即多 2,111。我怀疑这是某种缓冲问题,因为后一个数字是 2^12 的倍数(和 2^13,但在其他情况下它符合 2^12 的倍数)。额外的数据要么是从文件的另一部分读取的相应字节数(它似乎每次只从 4 个地址之一读取,一直到最后),或者在一种情况下字节 CD
重复 2,111次。
相关代码:
std::string url; // defined elsewhere
FILE* data; // initialized elsewhere with option "wb"
CURL* query = curl_easy_init();
curl_easy_setopt(query, CURLOPT_WRITEDATA, data);
curl_easy_setopt(query, CURLOPT_URL, url);
curl_easy_setopt(query, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(query, CURLOPT_SSL_VERIFYPEER, false);
CURLcode res = curl_easy_perform(query);
此外:使用简单的写回调时会出现同样的问题,并且任何给定的远程服务器都会出现该问题,而不仅仅是这个特定的服务器。
编辑 #1: 我只能在 Windows 上复制它(在具有相同库文件的两台机器上测试)。它适用于 Debian。
编辑 #2: 当 libcurl
在我的笔记本电脑上构建时也会发生。为了提供额外的上下文,我在 Windows 10.
我将其归因于一些奇怪的 VC 错误或其他异常行为。重写问题代码以使用 fstream
而不是 FILE
就成功了。