0


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 sudomakesudomakeinstall- 编译安装完成后,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版本库 在这里插入图片描述
  • 这里包含编译出来的openssl头文件目录在这里插入图片描述
  • 再链接编译出来的openssl动态库目录在这里插入图片描述
  • 保存编译后,在libcurl目录下的 build\Win32\VC14\DLL Release - DLL OpenSSL 目录下就会生成对应的libcurl静态库和动态库。在这里插入图片描述

相关接口

  • 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类型指针- 返回值 : 返回 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参数介绍- 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>typedefstruct{ std::string body;size_t bodySize;} stResponse;typedefstruct{ std::string header;size_t headerSize;} stResponseHeader;size_tresponseBodyCallback(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_tresponseHeaderCallback(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;}intmain(){ std::string readBuffer; stResponse response; stResponseHeader responseHeader;// 初始化所有可能的调用curl_global_init(CURL_GLOBAL_ALL); CURL *curl =curl_easy_init();// 设置urlcurl_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);return0;}
  • 完整工程已上传至gitee 测试工程

参考

  • 官方API文档
标签: 网络 c++ 网络协议

本文转载自: https://blog.csdn.net/new9232/article/details/135495762
版权归原作者 大草原的小灰灰 所有, 如有侵权,请联系我们删除。

“libcurl开源库的编译与使用全攻略”的评论:

还没有评论