我最近一直在努力了解有关CURL的更多信息,并最终成功地将其编译并安装为我的测试项目的静态库。最后,我将继续学习发布表格等。
我已成功设法连接并打印http://www.google.se
的页面内容。
当连接到安全的http页面https://www.google.se
时,我得到一个空字符串作为页面内容。
我正在使用this来获取有关选项的信息。
我尝试了this answer中的内容,但它没有用,或者我做错了 我也尝试关闭verifypeer和verifyhost(虽然我真的想练习安全解决方案),但它也没有用。
我需要做些什么才能让它发挥作用? 我做错了吗?
这是测试代码
#include <iostream>
#include <string>
#include <curl/curl.h>
using namespace std;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
((string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main(){
CURL *curl;
CURLcode res;
string readBuffer;
curl = curl_easy_init();
if(curl){
curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE);
//Doesn't seem to work
curl_easy_setopt(curl, CURLOPT_CAINFO, "path\\cacert.pem");
//Neither does this
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
cout<<readBuffer<<endl;
system("pause");
}
return 0;
}
所以我从curl说Unsupported protocol
得到了错误消息,我猜它是SSL无效的说法。所以我不得不用SSL重新编译它(这很奇怪,因为我认为我是第一次做的)但是......
NMAKE: fatal error U1077 nasmw
在制作SSL时,即使我明确地给了它正确的%PATH%到nasm。我按照信中的步骤进行了操作。
所以我尝试使用curl binaries of type libcurl,但我不知道如何在VC ++中正确链接它,因为我不熟悉库文件。
在尝试编译测试项目时,我不断收到这些链接器错误。
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_cleanup referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_strerror referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_perform referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_setopt referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_init referenced in function _main
如此沮丧......我希望我明白为什么它必须如此复杂 我只想使用该库!
好的......我设法使用SSL编译curl库并启用报告CURL_VERSION_SSL
curl_version_info_data * vinfo = curl_version_info(CURLVERSION_NOW);
if(vinfo->features & CURL_VERSION_SSL){
cout<<"CURL: SSL enabled"<<endl;
}else{
cout<<"CURL: SSL not enabled"<<endl;
}
//Prints out "CURL: SSL enabled"
但我仍然收到相同的错误消息Unsupported protocol
。我不知道我做错了什么。
答案 0 :(得分:2)
好吧,在我第n次编译库之后,一切看起来都很好,直到我调试它并且它给了我堆错误,这表明我犯了一个错误*再次抽搐抽搐*。
在开始新的编译会话之前,我再次浏览了curl.haxx并找到了一个MSVC包。这让我很高兴,因为我知道如何处理这些!我选择了静态库,因为这就是我想要的。
虽然并非一切顺利,但我必须添加一些额外的链接器依赖项才能使其正常工作。
即
#pragma comment(lib, "curllib_static.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "openldap.lib")
#pragma comment(lib, "libeay32.lib")
将其放入并使用我下载的其他软件包中的证书包,以便我可以连接到HTTPS。
curl_easy_setopt(curl, CURLOPT_CAINFO, "_path_\ca-bundle.crt");
我收到了一些警告,警告我以前从未见过。它们不会弄乱任何东西,但它与PDB文件“vc90”有关,我认为VC ++本身可以处理。
这是在 最终 具有正确的CURL库之后连接到https://www.google.se
的代码(在项目属性下删除并添加了链接器依赖项中的pragma)。
这是MSVC package(已启用SSL)。您可以使用this package中的一个脚本(perl或VBscript)为您制作证书包。
哦,如果你使用像我这样的静态库,你必须添加预处理器定义CURL_STATICLIB
#include <iostream>
#include <string>
#include <curl/curl.h>
using namespace std;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
((string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main(){
CURL *curl;
CURLcode res;
string readBuffer;
curl = curl_easy_init();
if(curl){
curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\libcurl_static\\ca-bundle.crt");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
cout<<readBuffer<<endl;
system("pause");
}
return 0;
}
真的是我的错,我应该检查他们拥有的下载向导的描述。我只下载了档案中的最新资源(7.27.0),因为我认为我 有 自己编译以获得我想要的东西。
整件事令人尴尬。不过我从中学到了很多东西。
答案 1 :(得分:1)
使用-v检查完整响应。它可能是一个重定向。此外,谷歌已知会阻止使用curl默认用户代理完成的请求......