【发布时间】:2018-02-06 13:37:04
【问题描述】:
我正在尝试使用 C++ 中的 libcurl 管理下载进度。 我已经设法用 curl_easy 做到了这一点,但 curl_easy 的问题是它会阻塞程序,直到发出请求为止。
我需要使用 curl_mutli,所以 http 请求是异步的,但是当我尝试更改为 curl_multi 时,我的进度功能停止工作。
我有以下 curl_easy 请求代码:
int progressFunc(void* p, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded) {
std::cout << TotalToDownload << ", " << NowDownloaded << std::endl;
return 0;
}
FILE* file = std::fopen(filePath.c_str(), "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progressFunc);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
CURLcode res = curl_easy_perform(curl);
完美运行并将下载进度打印到控制台。
但是,当尝试修改此代码以改用 curl_multi 时,文件无法正确下载(显示 0 字节)并且下载进度回调函数仅显示 0, 0。
FILE* file = std::fopen(filePath.c_str(), "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progressFunc);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
curl_multi_add_handle(curlm, curl);
int runningHandles;
CURLMcode res = curl_multi_perform(curlm, &runningHandles);
【问题讨论】: