libcurl 的 curl_multi_perform 什么时候开始传输?
When does libcurl's curl_multi_perform start the transfer?
我正在尝试了解 curl_multi_perform
的功能,以便在我的项目中使用它。我在 https://gist.github.com/clemensg/4960504.
找到了示例代码
下面是我怀疑的代码:
for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
}
// I thought this statement will start transfer.
//A-- curl_multi_perform(cm, &still_running);
sleep(5); // put this to check when transfer starts.
do {
int numfds=0;
int res = curl_multi_wait(cm, NULL, 0, MAX_WAIT_MSECS, &numfds);
if(res != CURLM_OK) {
fprintf(stderr, "error: curl_multi_wait() returned %d\n", res);
return EXIT_FAILURE;
}
/*
if(!numfds) {
fprintf(stderr, "error: curl_multi_wait() numfds=%d\n", numfds);
return EXIT_FAILURE;
}
*/
//B-- curl_multi_perform(cm, &still_running);
} while(still_running);
我的理解是,当调用 curl_multi_perform
时传输开始,但在上面的代码中,标签 A 处的 curl_multi_perform
不会启动传输。我检查了 wireshark 日志。当控件移过 sleep()
语句时,我看到了第一个日志输出。
我什至试过下面的代码:
for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
curl_multi_perform(cm, &still_running);
sleep(5);
}
但是,结果是一样的。当控件在此循环中时,我没有在 wireshark 中看到任何日志,但是,一旦我开始在 wireshark 中看到日志,它们就会以 5 秒为间隔。
除了这些疑惑,我的疑惑还有:
- 为什么标签 A 和 B 有两个
curl_multi_perform
?
- 我可以在添加句柄时多次调用
curl_multi_perform
吗
在通话之间?
感谢帮助。
谢谢
curl_multi_perform 以非阻塞方式工作。它会在不阻塞的情况下尽可能多地做,然后它 returns,期望在需要时再次被调用。因此,第一个调用最有可能开始解析 URL 中使用的名称,然后第二个或第三个调用可能开始实际传输或其他操作。它的设计使应用程序不必关心执行它的确切函数调用号。
然后你一直调用它,直到所有传输完成。
我试图在“一切卷曲”一书中的一章中解释这个概念:Driving with the "multi" interface
我正在尝试了解 curl_multi_perform
的功能,以便在我的项目中使用它。我在 https://gist.github.com/clemensg/4960504.
下面是我怀疑的代码:
for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
}
// I thought this statement will start transfer.
//A-- curl_multi_perform(cm, &still_running);
sleep(5); // put this to check when transfer starts.
do {
int numfds=0;
int res = curl_multi_wait(cm, NULL, 0, MAX_WAIT_MSECS, &numfds);
if(res != CURLM_OK) {
fprintf(stderr, "error: curl_multi_wait() returned %d\n", res);
return EXIT_FAILURE;
}
/*
if(!numfds) {
fprintf(stderr, "error: curl_multi_wait() numfds=%d\n", numfds);
return EXIT_FAILURE;
}
*/
//B-- curl_multi_perform(cm, &still_running);
} while(still_running);
我的理解是,当调用 curl_multi_perform
时传输开始,但在上面的代码中,标签 A 处的 curl_multi_perform
不会启动传输。我检查了 wireshark 日志。当控件移过 sleep()
语句时,我看到了第一个日志输出。
我什至试过下面的代码:
for (i = 0; i < CNT; ++i) {
init(cm, i); // this is setting options in curl easy handles.
curl_multi_perform(cm, &still_running);
sleep(5);
}
但是,结果是一样的。当控件在此循环中时,我没有在 wireshark 中看到任何日志,但是,一旦我开始在 wireshark 中看到日志,它们就会以 5 秒为间隔。
除了这些疑惑,我的疑惑还有:
- 为什么标签 A 和 B 有两个
curl_multi_perform
? - 我可以在添加句柄时多次调用
curl_multi_perform
吗 在通话之间?
感谢帮助。 谢谢
curl_multi_perform 以非阻塞方式工作。它会在不阻塞的情况下尽可能多地做,然后它 returns,期望在需要时再次被调用。因此,第一个调用最有可能开始解析 URL 中使用的名称,然后第二个或第三个调用可能开始实际传输或其他操作。它的设计使应用程序不必关心执行它的确切函数调用号。
然后你一直调用它,直到所有传输完成。
我试图在“一切卷曲”一书中的一章中解释这个概念:Driving with the "multi" interface