2016-05-14 74 views
2

我試圖利用多線程的libcurl。在閱讀documentation時,我理解正確的做法是爲每個線程使用一個單獨的CURL*句柄。多線程使用libcurl失敗

這就是我想要做的事:

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) 
{ 
    ((std::string*)userp)->append((char*)contents, size * nmemb); 
    return size * nmemb; 
} 

bool KeyIsValid(std::string keytocheck) { 
    CURL *curl; 
    CURLcode res; 
    std::string content; 

    curl = curl_easy_init(); 
    if (curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/mypage.php"); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content); 

     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ("something=hello&somethingtwo=" + keytocheck).c_str()); 
     res = curl_easy_perform(curl); 
     curl_easy_cleanup(curl); 

     // std::cout << content << std::endl; 
     if (content.find("id or key is not correct") == std::string::npos) // if i use an != the correct key (abc) doesn't get printed 
     { 
      return false; 
     } 
     else { 
      return true; 
     } 
    } 
} 

總結這段代碼,我可以說我在爲每個線程新手柄的工作。它向我的本地主機發出請求,並在執行發佈請求後使用回調函數將內容存儲到std::string。 之後,我檢查一下,如果網頁包含一些用於輸入/更正的ID /密鑰的標識符。確切地說,頁面打印出這個:

id or key is not correct 

當id/key不正確。這是我如何調用該方法KeyIsValid()

if (KeyIsValid(currentKey)) 
     { 
      std::cout << "key tested with success -> " << currentKey << '\n'; 
      return 1; // 1 = success 
     } 

但是當我檢查存儲在一個數組(數組中的1個存儲的密鑰等於1個新的線程)每一個關鍵,我得到一些「誤解」:

key tested with success -> abc 
key tested with success -> hello 
key tested with success -> hello 
key tested with success -> hello 

而唯一正確的密鑰只有abc。我不知道爲什麼該程序打印正確的密鑰abc後跟其他不正確的鍵。 但是,如果我將數組的項目更改爲僅兩項(abchello,因此使用兩個線程),所有內容似乎都能正常工作,因爲我只打印了abc鍵。

我做了一些搜索在互聯網上,這是what I found

我有一個關於執行使用libcurl的並行HTTP的請求(C++)的安全性的問題。在閱讀這個問題時,請記住我一般對HTTP請求的知識有限。基本上,假設我有兩個(或更多)線程,每個線程每秒發出一次HTTP請求。 (所有請求都發送到同一臺服務器)。我的程序(或別的什麼?)如何跟蹤HTTP響應屬於哪個階段?我的意思是,我可以確定,如果請求A是從線程1發出的,並且同時請求線程2中的B,並且同時回覆響應,則正確的響應(響應A)會轉到線程1,並且響應B到線程2?請原諒我對這件事的無知。謝謝。

這傢伙只是問我同樣的問題沒有被更具體(他沒有顯示任何代碼)。

我要確切地想問:

我可以肯定地說,如果請求是從線程1,並要求B從線程2在同一時間發送,響應被retrived同時,正確的響應(響應A)進入線程1並響應B到線程2?

參考我的代碼。也許我錯誤地分析了頁面,我不知道。

對不起,我在這件事上無知。

編輯:

  • 經過兩個日子裏,我試圖改變我的回調代碼,但仍沒有正常工作。

回答

0

我可以肯定地說,如果請求A從線程1,和要求B 從線程2在同一時間發送的,並且響應於 同時檢索正確的響應(響應A)去線程1和 響應B到線程2?

是的,你可以是絕對當然。

+0

好的,如果是的話,什麼答案可以解釋程序的行爲? – smthidntknwo

+0

對不起,但我沒有足夠的細節知道這一點。我確實知道libcurl如何在內部工作。 –