这个问题/怪癖/副作用让我发疯。在代码底部附近,HTTP交互的响应代码通过引用传递给responseCode_。然而,即使可以以其他方式访问该站点,它通常也会显示为0,并且返回太快而不能超时......
定义了所有变量,下面的代码只是类中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);
更新
当响应代码为0时, curl_easy_perform
没有返回CURLE_OK,正如标记的答案所解释的那样。但是,调试钩子也非常有用并且是一个很好的建议
答案 0 :(得分:2)
只有在curl_easy_perform()返回CURLE_OK时才会设置响应代码,因此您应首先检查响应代码以确保curl实际成功执行了请求。你确定正确设置了用于编写标题和正文的回调函数吗?
另外,确保在这些easy_perform线程开始之前调用curl_global_init(CURL_GLOBAL_ALL)。
假设curl_easy_init()返回的curl句柄中没有任何内容在线程间共享,那么代码看起来是正确的。
答案 1 :(得分:2)
使用libcurl中内置的调试钩子。
严重。 libcurl是void*
和错误代码的“C”噩梦。使用libcurl时, Everything 可能会出错。编写一次libcurl调试挂钩,不要将其从代码中删除。你将再次需要它们,再一次......再次。