我試圖利用多線程的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
後跟其他不正確的鍵。 但是,如果我將數組的項目更改爲僅兩項(abc
和hello
,因此使用兩個線程),所有內容似乎都能正常工作,因爲我只打印了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?
參考我的代碼。也許我錯誤地分析了頁面,我不知道。
對不起,我在這件事上無知。
編輯:
- 經過兩個日子裏,我試圖改變我的回調代碼,但仍沒有正常工作。
好的,如果是的話,什麼答案可以解釋程序的行爲? – smthidntknwo
對不起,但我沒有足夠的細節知道這一點。我確實知道libcurl如何在內部工作。 –