libcurl的curl_multi_perform何时开始传输?

时间:2016-02-25 17:56:45

标签: c libcurl

我正在尝试了解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); 的功能,以便我可以在我的项目中使用它。我在https://gist.github.com/clemensg/4960504找到了示例代码。

以下是我怀疑的代码:

curl_multi_perform

我的理解是,当curl_multi_perform被调用时,传输开始,但在上面的代码中,标签 A sleep()不会开始传输。我检查了wireshark日志。当控件移过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); } 语句时,我看到第一个日志输出。

我甚至试过下面的代码:

curl_multi_perform

但是,结果是一样的。当控件处于此循环中时,我没有看到wireshark中的任何日志,但是,一旦我开始在wireshark中看到日志,它们间隔为5秒。

除了这些疑虑之外,我的另一个疑问是:

  1. 为什么标签上有两个curl_multi_perform A&amp;乙
  2. 添加句柄时,我可以多次调用find . -name '*.txt' | parallel 'wc -l {}' 2>/dev/null | paste -sd+ - | bc 吗? 在电话之间?
  3. 帮助表示感谢。 感谢

1 个答案:

答案 0 :(得分:2)

curl_multi_perform以非阻塞的方式运作。它会在没有阻塞的情况下尽可能多地执行,然后返回,期望在需要时再次调用它。因此,第一次调用最有可能开始解析URL中使用的名称,然后第二次或第三次调用可能会启动实际传输或其他内容。它的设计使得应用程序不必关心执行它的确切函数调用号。

然后你一直调用它直到完成所有转移。

我试图在即将出版的(免费和在线)书籍的一章中解释这个概念:Driving with the "multi" interface