2016-05-14 138 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如何在内部工作。 –