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 秒为间隔。

除了这些疑惑,我的疑惑还有:

  1. 为什么标签 A 和 B 有两个 curl_multi_perform
  2. 我可以在添加句柄时多次调用 curl_multi_perform 吗 在通话之间?

感谢帮助。 谢谢

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

然后你一直调用它,直到所有传输完成。

我试图在“一切卷曲”一书中的一章中解释这个概念:Driving with the "multi" interface