2016-02-25 13 views
1

我想了解curl_multi_perform的功能,以便我可以在我的項目中使用它。我在https://gist.github.com/clemensg/4960504找到了一個示例代碼。何時libcurl的curl_multi_perform開始傳輸?

下面是我的疑問是代碼:

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被稱爲傳送開始,但在上面的代碼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. 爲什麼有兩個curl_multi_perform在標籤一個&乙
  2. 我可以多次呼叫curl_multi_perform,同時在呼叫之間添加句柄 ?

幫助讚賞。 謝謝

回答

2

curl_multi_perform以非阻塞的方式工作。它會盡可能多地進行阻塞,然後返回,期望在需要時再次調用。因此,第一個調用很可能開始解析URL中使用的名稱,然後可能第二個或第三個調用開始實際的傳輸或某事。它的設計使應用程序不必關心使用哪個確切的函數調用號碼。

然後你繼續調用它,直到所有的傳輸完成。

我試圖解釋一個章節這一概念我即將(免費和在線)書:Driving with the "multi" interface

+0

我想打電話一次,開始爲相關的簡單的手柄和其他調用多全部轉讓要知道還有多少請求尚未完成。我不明白每次調用multi_perform如何執行不同的任務。 – Jardanian

+0

libcurl保留每次傳輸的確切狀態,以便它知道它在哪裏以及它應該如何繼續從每個傳輸 –

相關問題