libcurl开源库的编译与使用全攻略

这篇具有很好参考价值的文章主要介绍了libcurl开源库的编译与使用全攻略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

libcurl简介

  • libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库,提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等。
  • libcurl 的主要特点包括
    • 支持多种协议:libcurl 支持多种协议,如 HTTP、FTP、SMTP 等,方便开发者在不同的场景下使用。
    • 易于使用:libcurl 的 API 设计简洁,易于使用,方便开发者快速开发出网络通信功能。
    • 可移植性强:libcurl 支持多种操作系统,如 Linux、Windows、MacOS 等,方便开发者在不同的平台上使用。
    • 可定制性强:libcurl 支持插件机制,开发者可以根据自己的需求定制不同的插件,实现不同的功能。
    • 高效稳定:libcurl 在数据传输过程中采用了多种优化技术,保证了数据传输的高效性和稳定性。
  • 总的来说,libcurl 是一个功能强大、易于使用、可移植性强、可定制性强、高效稳定的网络通信库,被广泛应用于各种软件开发中。
  • 本文章主要介绍libcurl在windows和linux平台下的编译步骤,并介绍了libcurl相关的API接口,最后通过一个demo演示如何通过libcurl发送http请求。

libcurl相关包下载

  • libcurl github路径
  • libcurl发行版本路径
    • linux平台下载tar.gz包。以7.85.0版本为例,下载curl-7.85.0.tar.gz 包。
    • windows平台下载zip包。 以7.85.0版本为例,下载curl-7.85.0.zip 包
  • openssl发行版本 :使用libcurl一般都需要依赖openssl库
    • openssl发行版本只有tar.gz包,windows/linux平台都使用这个包即可。以1.1.1u版本为例,下载 openssl-1.1.1u.tar.gz 包
  • perl下载 : windows平台安装openssl需要这个工具

linux平台libcurl库编译

  • 由于需要依赖openssl,先编译openssl库

  • openssl编译

    • 解压openssl压缩包后进入解压后的目录
    • 分别执行以下命令
    •   ./config --prefix=${PWD}/_install
        sudo make
        sudo make install
      
    • 编译安装完成后,openssl相关库和头文件都会释放到 _install 目录下
  • libcurl编译

    • 解压libcurl压缩包后进入解压后的目录
    • 分别执行以下命令
    •   ./configure --prefix=${PWD}/_install --with-openssl=${PWD}/../openssl-1.1.1u/_install
        sudo make 
        sudo make install
      
    • –prefix 指定的是安装目录,如果不指定会默认安装到系统目录下。–with-openssl 指定的是openssl相关库目录。
    • 编译安装完成后,相关库和头文件会释放到_install目录下

windows平台libcurl库编译

  • 先安装perl,还需安装Visual Studio,建议使用 Visual Studio 2015
  • 解压libcurl后进入目录
  • 进入projects目录执行以下命令先编译openssl
    •   build-openssl.bat vc14 -VSpath "E:\Program Files (x86)\Microsoft Visual Studio 14.0" x86 release ../../openssl-1.1.1u
      
    • VSpath指定的是 Visual Studio 2015 安装目录,如果默认安装在C盘,可不指定。最后指定openssl包的目录
    • 编译完成后,会在openssl目录下的 build\Win32\VC14 下生成openssl相关头文件和目录
  • 进入libcurl目录下的 projects\Windows\VC14 目录,使用 Visual Studio 2015 打开 curl-all.sln
  • 解决方案将libcurl设为启动项目,这里选择编译32位,依赖openssl的Release版本库 libcurl开源库的编译与使用全攻略,实用框架,网络,c++,网络协议
  • 这里包含编译出来的openssl头文件目录
    libcurl开源库的编译与使用全攻略,实用框架,网络,c++,网络协议
  • 再链接编译出来的openssl动态库目录
    libcurl开源库的编译与使用全攻略,实用框架,网络,c++,网络协议
  • 保存编译后,在libcurl目录下的 build\Win32\VC14\DLL Release - DLL OpenSSL 目录下就会生成对应的libcurl静态库和动态库。
    libcurl开源库的编译与使用全攻略,实用框架,网络,c++,网络协议

相关接口

  • CURLcode curl_global_init(long flags)

    • 描述:初始化libcurl,只能调用一次,且在其他函数之前调用
    • 参数
      • flags
        • CURL_GLOBAL_ALL : 初始化所有的可能的调用。
        • CURL_GLOBAL_SSL : 初始化支持 安全套接字层。
        • CURL_GLOBAL_WIN32 : 初始化win32套接字库。
        • CURL_GLOBAL_NOTHING : 没有额外的初始化
    • 返回值 : 返回 CURLE_OK 为成功,返回其他值失败
  • CURL *curl_easy_init(void)

    • 描述:初始化一个CURL类型的指针,要在 curl_easy_cleanup 中进行释放。
    • 返回值: 返回一个 CURL 类型指针,在 curl_easy_setopt 函数中使用
  • CURLcode curl_easy_setopt(CURL *curl, CURLoption option, …);

    • 描述:设置选项
    • 参数
      • curl : curl_easy_init 返回的 CURL类型指针
      • option :curl_easy_setopt函数option参数介绍
    • 返回值 : 返回 CURLE_OK 为成功,返回其他值失败
  • CURLcode curl_easy_perform(CURL *curl)

    • 描述:以阻塞方式执行请求
    • 参数
      • curl :curl_easy_init 返回的 CURL类型指针
    • 返回值:返回 CURLE_OK 为成功,返回其他值失败
  • CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, …)

    • 描述:请求curl 会话中的相关信息
    • 参数
      • curl :curl_easy_init 返回的 CURL类型指针
      • info
        • CURLINFO_RESPONSE_CODE :获取http状态码
        • 其他参数描述
    • 返回值:返回 CURLE_OK 为成功,返回其他值失败
  • void curl_easy_reset(CURL *curl)

    • 描述:重新初始化CURL指针为默认值
  • void curl_easy_cleanup(CURL *curl)

    • 描述:清理 curl_easy_init 接口申请的 CURL 类型指针
  • curl_easy_setopt函数option参数介绍文章来源地址https://www.toymoban.com/news/detail-789381.html

    • CURLOPT_URL :设置要访问的URl
    • CURLOPT_WRITEFUNCTION :设置回调函数,回调函数在libcurl接收到数据后被调用
      • 回调函数原型:size_t function(void *ptr, size_t size, size_t nmemb, void *stream);
    • CURLOPT_WRITEDATA :用于表明 CURLOPT_WRITEFUNCTION 函数中的stream指针的来源
    • CURLOPT_HEADERFUNCTION :设置回调函数,回调函数在libcurl接收到http响应头后被调用
      • 回调函数原型 : size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
    • CURLOPT_HEADERDATA : 表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。
    • CURLOPT_TIMEOUT :设置数据传输超时时间
    • CURLOPT_CONNECTIONTIMEOUT :设置连接超时时间
    • CURLOPT_POST :设置请求方式为post
    • CURLOPT_POSTFIELDS : 设置post请求体
    • CURLOPT_POSTFIELDSIZE :设置post请求大小
    • CURLOPT_HTTPHEADER : 设置http请求头
    • CURLOPT_SSL_VERIFYPEER :设置是否验证对端证书,设置为0表示不验证。默认为1,表示验证。
    • CURLOPT_SSL_VERIFYHOST :设置是都验证服务器证书,设置为0表示不验证。
    • 其他参数

演示代码

  • 本测试代码通过libcurl实现发送http请求
  •   #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <curl/curl.h>
      #include <iostream>
      
      typedef struct {
          std::string body;
      	size_t bodySize;
      } stResponse;
      
      typedef struct {
          std::string header;
      	size_t headerSize;
      } stResponseHeader;
      
      size_t responseBodyCallback(void *ptr, size_t size, size_t nmemb, void *stream) {
          stResponse* pResponse = (stResponse*)stream;
      	pResponse->body.append((char*)ptr, size * nmemb);
      	pResponse->bodySize = size * nmemb;
      	return size * nmemb;
      }
      
      size_t responseHeaderCallback(void *ptr, size_t size, size_t nmemb, void *stream){
      	stResponseHeader* pResponseHeader = (stResponseHeader*)stream;
      	pResponseHeader->header.append((char*)ptr, size * nmemb);
      	pResponseHeader->headerSize = size * nmemb;
      	return size * nmemb;
      }
      
      int main(){
      	std::string readBuffer;
      	stResponse response;
      	stResponseHeader responseHeader;
      
      	// 初始化所有可能的调用
      	curl_global_init(CURL_GLOBAL_ALL);
      
      	
      	CURL *curl = curl_easy_init();
      
      	// 设置url
      	curl_easy_setopt(curl, CURLOPT_URL, "http://182.92.205.179:10088");
      
      	// 设置post请求,不设置或设置为0则为get请求
      	curl_easy_setopt(curl, CURLOPT_POST, 1);
      	// 设置post请求体
      	char postData[1024] = "{\"req\":\"hello\"}";
      	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
      	// 设置post请求体大小
      	curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(postData));
      
      	// 设置http请求头
      	curl_slist* headerList = NULL;
      	headerList = curl_slist_append(headerList, "Content-Type: application/json");
      	headerList = curl_slist_append(headerList, "flag: libcurl");
      	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList);
      
      	// 设置不校验证书,https请求时使用
      	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
          curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
      
      	// 设置回调函数获取响应体数据
      	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);
      	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response);
      
      	// 设置回调函数获取响应头数据
      	curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeaderCallback);
      	curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&responseHeader);
      
      	// 超时时间
      	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
      
      	// 执行请求
      	CURLcode res = curl_easy_perform(curl);
      
      	// 检查错误
      	if(res == CURLE_OK){
      		// 获取状态码
      		int responseCode = 0;
      		curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
      		std::cout << "code : "<<responseCode << std::endl;
      
      		std::cout << "responseHeader size : "<<responseHeader.headerSize << std::endl;
      		std::cout << "responseHeader header : "<<responseHeader.header.c_str() << std::endl;
      
      		std::cout << "response size : "<<response.bodySize << std::endl;
      		std::cout << "response body : "<<response.body.c_str() << std::endl;
      	}else{
      		std::cout<<curl_easy_strerror(res)<<std::endl;
      	}
      
      	curl_slist_free_all(headerList);
      
      	// 清理
      	curl_easy_cleanup(curl);
      
      
      	return 0;
      }
    
  • 完整工程已上传至gitee 测试工程

参考

  • 官方API文档

到了这里,关于libcurl开源库的编译与使用全攻略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python开发者必读:Pip使用全攻略与最佳实践

    在这篇文章中,我们将深入探讨Python的主要包管理工具——Pip。内容涵盖了Pip的基本概念、安装和配置、中国国内镜像源的使用、包管理、与虚拟环境的关系、高级用法、问题解决。 在现代的软件开发实践中,依赖管理成为了一项非常重要的任务。它确保了我们可以在任何地

    2024年02月16日
    浏览(44)
  • HackTheGame游戏全攻略

    游戏链接 链接: 百度网盘 请输入提取码 提取码:bu1w HackTheGame游戏的玩法: 您将扮演一个黑客的角色,接受各种各样的任务,在不被发现的情况下,使用一些工具入侵他人的电脑,服务器并完成窃取资料,粉碎文件,植入病毒等操作.您有一共有两次机会,第三次被追踪到的话,您就会被捕

    2024年02月05日
    浏览(78)
  • MongoDB 索引全攻略

    目录 一、索引介绍         1.1 单字段索引         1.2 复合索引         1.3 多键索引         1.4 主键索引         1.5 TTL 索引         1.6 地理空间索引         1.7 哈希索引         1.8 创建索引时注意事项         1.9 索引效果查看  二、索引实现原理         2.1 为

    2024年04月27日
    浏览(69)
  • Github搭建个人博客全攻略

    Github是开发者的代码仓库,一个开源和分享社区。 本文前提是已注册github账号。 假设用户名为MyName 进入个人主页(https://github.com/用户名),选择Repositories,点击New Repository name填入MyName.github.io,即MyName/ MyName.github.io ,点击Create Repository 安装Git或TortoiseGit(后者添加环境变量)

    2024年02月16日
    浏览(63)
  • Jenkins 插件安装方式全攻略

    在Jenkins 的安装向导页面中, 会有一步是否安装推荐的插件, 可以直接进行安装, 也可以跳过。 对于安装机器联网的状况, 安装插件相对方便,直接搜索插件安装, 但是也可能会出现无法在线安装的状况, 原因解析及解决方法 参考: Jenkins 在Windows下插件无法安装问题解

    2023年04月21日
    浏览(70)
  • 谷歌账号注册流程全攻略

    一、访问谷歌账号注册页面 首先,你需要访问谷歌账号注册页面。你可以直接点击此链接,或者在谷歌首页点击右上角的“登录”按钮,在弹出的登录框中点击“创建帐号”。 在注册页面,你需要填写以下个人信息: 名字:输入你的名字。 姓氏:输入你的姓氏。 用户名:

    2024年02月05日
    浏览(57)
  • 新手搭建服装小程序全攻略

    随着互联网的快速发展,线上购物已经成为了人们日常生活中不可或缺的一部分。服装作为人们日常消费的重要品类,线上化趋势也日益明显。本文将详细介绍如何从零开始搭建一个服装小程序商城,从入门到精通的捷径,帮助你快速掌握小程序商城的制作方法和技巧。 首先

    2024年02月21日
    浏览(49)
  • 开发巴西市场全攻略,外贸人收藏

    巴西联邦共和国位于南美洲东部,是南美洲资源最丰富,经济活力和经济实力最强的国家。巴西作为拉丁美洲的出口大国,一直是一个比较有潜力的市场,亦是我国外贸公司和独立外贸人集群的地方。 2021年巴西贸易概况 ✦ 1、2021年巴西贸易创纪录 2021年,巴西的对外贸易以

    2024年02月05日
    浏览(62)
  • TortoiseSVN源码安装与迁移全攻略

    一、前言 随着版本控制系统的普及,越来越多的开发者和团队开始使用SVN(Subversion)来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程,帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装,apr、apr-util、zlib、sqlite apr 环境   apr-util 环境 zl

    2024年01月24日
    浏览(61)
  • kaggle免费服务器全攻略

    1. kaggle服务器16G显卡一周40小时. 所以我们直接干一堆谷歌账号即可 2. 谷歌账号的注册: 我们需要FQcolab for windows可以做到. 然后我们注册好账号后.我们注册4个账号. 注册方法. 打开chrome   点最下面的添加按钮.然后一直下一步即可.无脑注册. 3.  为Chrome多账户添加单独的快捷方

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包