Linux平台下用C/C++实现Http/Https请求(libcurl)

本文档详细介绍了如何手动编译安装OpenSSL和libcurl,并解决了在编译安装过程中遇到的链接库错误和配置问题。通过创建软链接、配置环境变量以及指定编译选项来确保安装成功,并能够正常使用curl命令和libcurl库进行HTTPS请求。
摘要由CSDN通过智能技术生成

1.编译安装 openssl
从官网下载最新版本:https://www.openssl.org/source/
在这里插入图片描述
首先解压下载好的安装包 openssl-1.1.1m.tar.gz

tar xzvf openssl-1.1.1m.tar.gz

然后进入目标目录进行编译

cd openssl-1.1.1m

./config

make

sudo make install

此时,openssl已安装完毕,可通过 make test 测试。

  • 查看openssl版本:openssl version 出现以下错误:
    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

解决办法:

ln -s /usr/local/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
ln -s /usr/local/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1

  1. 编译安装 libcurl
    curl库下载地址:https://curl.haxx.se/download.html
    在这里插入图片描述

同样下载解压安装包后(curl-7.81.0.tar.gz),进入工程目录进行编译

tar xzvf curl-7.81.0.tar.gz
cd curl-7.81.0
./buidconf
./configure --prefix=/usr/local/curl-7.81.0/
make
sudo make install

即完成安装。

3.编写 https 代码
代码参考:Linux C/C++实现https post/get请求

  • 如出现以下报错:
    configure error: select TLS backend(s) or disable TLS with --without-ssl

解决办法:
执行configure脚本时,使用以下指令:

./configure --prefix=/usr/local/curl-7.81.0/ --with-wolfssl

然后配置环境:

sudo vi /etc/bash.bashrc

在最后添加:

LIBRARY_PATH=/usr/local/curl-7.81.0/lib
export LIBRARY_PATH

保存退出,并更新环境:

source bash.bashrc

此时可使用curl指令:curl http://www.baidu.com

  • 在使用libcurl的程序编译过程中,如出现以下报错:
    /usr/bin/ld: 找不到 -lcurl

解决办法:

locate libcurl.so

显示结果,在 /usr/lib/x86_64-linux-gnu 目录下没有libcurl.so,即需要创建:

sudo ln -sf /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 /usr/lib/x86_64-linux-gnu/libcurl.so

这样编译时即可找到 -lcurl

  • 在使用libcurl的程序编译过程中,如出现以下报错:
    fatal error: curl/curl.h: 没有那个文件或目录

解决办法:

sudo cp -r /usr/local/curl-7.81.0/include/curl /usr/include

要在C++实现HTTPS请求,可以使用第三方库,例如CURL或Boost.Beast。 使用CURL的示例代码如下: ```cpp #include <iostream> #include <curl/curl.h> int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); res = curl_easy_perform(curl); if (res != CURLE_OK) std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; } ``` 这个示例代码使用libcurl库,它提供了一个易于使用的API,用于发送HTTPHTTPS请求。在使用libcurl时,需要先调用`curl_global_init()`初始化库,然后创建一个CURL对象,并设置请求的URL和其他选项。最后,调用`curl_easy_perform()`函数发送请求并接收响应。如果请求成功,该函数返回CURLE_OK,否则返回一个错误代码。 请注意,HTTPS请求需要使用SSL / TLS协议进行加密。为了支持HTTPS请求,需要在编译时启用libcurl的SSL支持,并提供SSL库和证书文件。在Unix / Linux系统上,可以使用OpenSSL库。在Windows系统上,可以使用Schlumberger Cryptographic Service Provider或Microsoft CryptoAPI等。 如果使用Boost.Beast库发送HTTPS请求,示例代码如下: ```cpp #include <iostream> #include <boost/beast/core.hpp> #include <boost/beast/ssl.hpp> #include <boost/beast/http.hpp> #include <boost/asio/connect.hpp> #include <boost/asio/ip/tcp.hpp> namespace beast = boost::beast; namespace http = beast::http; namespace net = boost::asio; namespace ssl = net::ssl; using tcp = net::ip::tcp; int main() { net::io_context ioc; ssl::context ctx(ssl::context::tlsv12_client); tcp::resolver resolver(ioc); beast::ssl_stream<beast::tcp_stream> stream(ioc, ctx); auto const results = resolver.resolve("www.example.com", "443"); beast::get_lowest_layer(stream).connect(results); stream.handshake(ssl::stream_base::client); http::request<http::string_body> req{http::verb::get, "/", 11}; req.set(http::field::host, "www.example.com"); req.set(http::field::user_agent, "Beast"); http::write(stream, req); beast::flat_buffer buffer; http::response<http::dynamic_body> res; http::read(stream, buffer, res); std::cout << res << std::endl; beast::error_code ec; stream.shutdown(ec); if (ec == net::error::eof) ec = {}; if (ec) std::cerr << "Error: " << ec.message() << std::endl; return 0; } ``` 这个示例代码使用Boost.Beast库,它是一个现代C ++网络库,提供了HTTP和WebSocket支持。示例代码创建了一个SSL上下文对象,并使用DNS解析器解析主机名和端口号。然后,它创建一个SSL流对象,并与服务器进行握手。接下来,示例代码构造一个HTTP请求对象,并将其写入流中。最后,它读取服务器的响应并打印到标准输出中。 请注意,Boost.Beast库需要Boost.Asio库和OpenSSL库的支持。在使用Boost.Beast时,需要在编译时链接这些库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值