C++ libcurl http响应代码问题

问题描述:

这个问题/怪癖/副作用让我疯狂。在代码底部附近,HTTP交互的响应代码通过引用传递给responseCode_。然而,即使该站点可以被访问,但它通常会以0出现,并且返回太快而不能成为超时...C++ libcurl http响应代码问题

所有变量都已定义,下面的代码只是类中C++方法的一个片段。任何var_变量都是基于实例的。它在几个线程上运行,但这不应该是一个问题。每个使用libcurl的类在相应的线程上都有自己的实例。

预先感谢任何意见或建议...

CURL *curl; 
curl = curl_easy_init(); 
//The URL 
curl_easy_setopt(curl, CURLOPT_URL, url.getURLString().c_str()); 
//Timeout 
curl_easy_setopt(curl, CURLOPT_TIMEOUT, &timeout_); 
//disable signals to use with threads 
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); 
//Redirecting 
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); 
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); 
//Writing callback 
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &writerh); 
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &head_); 
//Writing callback 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writerb); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body_); 
//Headers 
struct curl_slist *headers = NULL; 
for (std::map<std::string, std::string>::iterator itr = requestHeaders_.begin(); itr != requestHeaders_.end(); itr++) { 
    std::stringstream header; 
    header << itr->first << ": " << itr->second; 
    headers = curl_slist_append(headers, header.str().c_str()); 
} 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
//UA 
curl_easy_setopt(curl, CURLOPT_USERAGENT, "RDFaS-Bot/1.0 (+http://www.rdfas.com/bot)"); 
curl_easy_perform(curl); /* ignores error */ 
//Response code 
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode_); 
//clean headers 
curl_slist_free_all(headers); 
curl_easy_cleanup(curl); 

更新:

curl_easy_perform没有返回CURLE_OK时响应代码为0,作为标记的答案解释。然而,调试钩子也非常有用,并且一个很好的建议

只有在curl_easy_perform()返回CURLE_OK时才会设置响应代码,因此您应该首先检查以确保curl实际上成功执行了请求。你确定写入标题和正文的回调函数是否设置正确?

另外,请确保在这些easy_perform线程启动之前调用curl_global_init(CURL_GLOBAL_ALL)。

假设curl_easy_init()返回的curl句柄中没有任何内容是跨线程共享的,那么代码看起来是正确的。

使用内置于libcurl中的调试钩子。

说真的。 libcurl是一个“C”梦魇void* s和错误代码。 使用libcurl时,所有内容都可能出错。编写一次libcurl调试钩子,不要将它们从代码中移除。你会再次需要它们,再一次......再次。