我试图利用多线程的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如何在内部工作。 –