gpt4 book ai didi

c++ - 使用 CURL 从 HTTPS 连接中获取任何内容

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:21 24 4
gpt4 key购买 nike

我最近一直在努力学习更多关于 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

太沮丧了...我希望我能理解为什么它必须如此复杂。
我只想使用这个库!


更新2

好的...我设法使用 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。我不知道我做错了什么。

最佳答案

好吧,在我第 n 次编译库之后,一切似乎都很好,直到我调试它并且它给了我堆错误,暗示我又犯了一个错误*twitch twitch*。

在开始新的编译 session 之前,我再次查看了 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++ 会自行处理。

这是在 finally 之后连接到 https://www.google.se 的代码(在项目属性下的链接器依赖项中删除并添加了 pragma) 拥有合适的 CURL 库。

这是 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) 下载了最新的源代码,因为我认为我必须自己编译它以获得我想要的东西。

这整件事很尴尬。不过,我从中学到了很多东西。

关于c++ - 使用 CURL 从 HTTPS 连接中获取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com