簡體   English   中英

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以非阻塞方式工作。 它會在不阻塞的情況下盡其所能,然后返回,並期望在需要時再次被調用。 因此,第一個調用最有可能開始解析URL中使用的名稱,然后第二個或第三個調用可能開始實際的傳輸或其他操作。 這樣做的目的是使應用程序不必關心執行它的確切函數調用號。

然后您繼續調用它,直到完成所有傳輸。

我試圖在我即將出版的(免費和在線)書的一章中解釋這一概念: 使用“多”界面駕駛

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM