带有进度表的 curl 多接口程序



我遇到了这个例子,它演示了 curl 多接口来下载单个文件。 卷曲多单。我已将此代码添加到我的程序中。我的要求如下。

我想下载并上传文件,并且在下载/上传
  1. 文件时,我希望屏幕上显示平均上传/下载速率。

  2. 我最初使用 curl 简单界面,只需一次调用curl_easy_perform.由于这是同步/阻塞,因此我无法让屏幕更新线程更新屏幕上的速率。

这是我切换到 curl 多接口的驱动器。因为它没有阻塞(切换到 curl 多接口后,我发现屏幕更新没有发生。卷曲多接口是否有望对我的情况有所帮助。您是否可以建议任何其他解决方案。

这是我代码的相关部分。

curl_multi_add_handle(m_multiCurl, m_curl);
curl_multi_perform(m_multiCurl, &stillRunning);
while(stillRunning) {
CURLMcode mc;
int numFds;
mc = curl_multi_wait(m_multiCurl, NULL, 0, 1000, &numFds);
if(mc != CURLM_OK) {
m_logger->errorf("curl_multi_wait() failed, code %d.n", mc);
break;
}
if(!numFds) {
repeats++;
if(repeats > 1) {
WAITMS(100);
}
} else {
repeats = 0;
}
curl_multi_perform(m_multiCurl, &stillRunning);
}

稍微违反直觉的是,您需要设置每个简单手柄的CURLOPT_NOPROGRESS(为零(,以获得每个简单手柄的进度表输出。请参阅下面的示例。

但是,我认为这是一个相当重要的问题,但是,当您同时进行多个传输时,每次传输输出内置进度表可能不是您想要的。

在任何时候进行多个传输时,我想您要做的是实现CURLOPT_XFERINFOFUNCTION回调并实现您自己的进度表,该进度表可以以一种很好的方式同时显示所有传输的进度。

CURLOPT_NOPROGRESS示例:

CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* enable progress meter */
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
/* Perform the request */
curl_easy_perform(curl);
}

相关内容

最新更新