libcurl快速入门

2023-11-16


/*libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议>。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。想要知道更多关于libcurl的介绍,可以到官网 http://curl.haxx.se/上去了解,在这里不再详述>。*/

/*https://blog.csdn.net/qq_39937902/article/details/84401796*/

/*在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输
前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程:
 * 1.       调用curl_global_init()初始化libcurl
 * 2.       调用curl_easy_init()函数得到 easy interface型指针
 * 3.       调用curl_easy_setopt()设置传输选项
 * 4.       根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
 * 5.       调用curl_easy_perform()函数完成传输任务
 * 6.       调用curl_easy_cleanup()释放内存
 * 在整过过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它. */

/*
 * CURLcode curl_global_init(long flags);
 * 参数:
 *     flags:
 *     CURL_GLOBAL_ALL             //初始化所有的可能的调用。
 *     CURL_GLOBAL_SSL             //初始化支持 安全套接字层。
 *     CURL_GLOBAL_WIN32           //初始化win32套接字库。
 *     CURL_GLOBAL_NOTHING         //没有额外的初始化。
 * 注意:这个函数与curl_global_cleanup对应,只调用一次.默认自动调用,多线程时要防止被多次调用,因此要
手动调用.
 *
 * void curl_global_cleanup(void);
 * 注意:同上.
 *
 * char *curl_version();
 * 打印当前libcurl版本号.
 *
 * CURL *curl_easy_init();
 * 初始化CURL句柄,与curl_easy_cleanup对应
 *
 * void curl_easy_cleanup(CURL *handle);
 * 销毁句柄
 *
 * CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
 * 描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比
如要查看一个网页的html代码等.(这个函数有些像ioctl函数)参数:
 * 参数:
 *     1 CURL类型的指针
 *     2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
 *     3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它
用什么这取决于第二个参数.
 *
 * CURLcode curl_easy_perform(CURL *handle);
 * 描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform>就像是个舞台.让我们设置的option运作起来.
 * 参数:
 *     CURL类型的指针.
 *
 *
 *--------------------------------------------------------------------------
 * CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
 * 参数:
 *     options:
 *     1,CURLOPT_URL 
 *         设置访问URL
 *
 *     2,CURLOPT_WRITEFUNCTION
 *         回调函数:size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
 *     CURLOPT_WRITEDATA
 *         CURLOPT_WRITEFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *
 *     3,CURLOPT_HEADERFUNCTION:
 *         回调函数:size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
 *         libcurl一旦接受到http头部数据将调用该函数.
 *     CURLOPT_HEADERDATA:
 *         CURLOPT_HEADERFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *         
 *     4,CURLOPT_READFUNCTION
 *         回调函数:size_t function(void *ptr, size_t size, size_t nmemb,void *stream);
 *         libcurl将需要读取的数据传递给远程主机时调用该函数.
 *     CURLOPT_READDATA
 *         CURLOPT_READFUNCTION的数据来源,对应回调函数里的void *ptr指针.
 *
 *     5,CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA
 *         跟数据传输相关的参数.
 *         CURLOPT_PROGRESSFUNCTION:回调函数是进度条响应并刷新函数.一秒一次.
 *         CURLOPT_NOPROGRESS:false:进度条函数生效.
 *         CURLOPT_PROGRESSDATA:进度条函数的void *ptr指针.
 *     6,CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
 *         前者设置传输时间,后者设置连接等待时间.
 *     7,CURLOPT_FOLLOWLOCATION:
 *         设置重定位URL.
 *     8,CURLOPT_RANGE: CURLOPT_RESUME_FROM:
 *         断点续传相关设置.
 *         CURLOPT_RANGE:指明http域的range头域
 *         头500bytes:bytes=0-499
 *         第二个500 :bytes=500-999
 *         最后的500 :bytes=-500
 *         500到最后 :bytes=500-
 *         第一和最后:bytes=0-0,-1  #即第0个到第0个,和最后1个byte
 *         CURLOPT_RESUME_FROM:传递一个long参数给libcurl,开始传输的偏移量
 *     9,CURLOPT_NOSIGNAL: 多线程中,DNS解析超时时,会发生"糟糕"的情况,此宏可预防这种情况.
 *         curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
 *         副作用:解析采用的是alarm(),不支持毫秒级超时,.但禁掉后,DNS解析将不受超时限制:DNS hang on,不返回超时信号.万一超时,程序可能会出现问题.
 *         解决方法:可以让libcurl使用c-ares(C library for asynchronous DNS requests)来做名字解析. 具体的可以在config curl的时候 
 *                 ./configure --enable-ares[=PATH]
 *
 *     curl_easy_perform:返回值: 0正确非0出错
 *         CURLE_OK 正确
 *         CURLE_UNSUPPORTED_PROTOCOL 不支持的协议
 *         CURLE_COULDNT_CONNECT 不能连接到remote host
 *         CURLE_REMOTE_ACCESS_DENIED 访问被拒绝
 *         CURLE_HTTP_RETURNED_ERROR http返回错误
 *         CURLE_READ_ERROR 读本地文件错误
 *         const char *curl_easy_strerror(CURLcode errornum)错误描述
 *
 *
 *
 *     
 *
 */

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libcurl快速入门 的相关文章

随机推荐

  • Open3D(C++) 根据索引提取点云

    目录 一 功能概述 1 主要函数 2 源码 二 代码实现 三 结果展示 本文由CSDN点云侠原创 原文链接 爬虫网站自重 把自己当个人 一 功能概述 1 主要函数 std shared ptr
  • 添加CSS样式的三种方法与CSS的注释

    目录 三种使用 CSS 的方法 外部 CSS 实例 mystyle css 内部 CSS 实例 行内 CSS 实例 多个样式表 实例 实例 层叠顺序 CSS 注释 实例 实例 实例 HTML 和 CSS 注释 实例 当浏览器读到样式表时 它
  • R_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server;

    error Error R NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by server MySQL 8 has su
  • C++性能优化系列——矩阵转置(四)OpenMP并行计算

    本系列之前的篇章都是基于单线程处理 实际工程中 通过多线程对程序进行并行化往往是最简单且直接有效的优化手段 本篇以C 性能优化系列 矩阵转置 三 内存填充避免缓存抖动 中优化好的程序为Base版本 通过OpenMP技术 对程序进一步做并行化
  • 下面几款接口测试工具,工作中都有用的那些?

    下面几款接口测试工具 工作中都有用的那些 1 Fiddler Fiddler是一款功能强大的接口测试软件 它可以帮助用户抓取 修改和重放HTTP HTTPS请求 是一款可视化的网络调试利器 它可以支持HTTP协议和HTTPS协议 支持GET
  • 初识pnpm

    初识pnpm 介绍 pnpm和npm yarn一样 都是包管理器 但是pnpm节约磁盘空间并且安装很快 所有的报会存储在硬盘的同一个位置 多个项目使用了同一个包时 在pnpm中他们是公用的 只会存储一遍 下次需要用到这个包时就会从硬盘中查找
  • FISCO BCOS 八、快速入门truffle(通过Ganache部署)

    目录 快速入门 Truffle 创建项目工程 项目结构 使用测试 编译合约 通过 Ganache 部署合约 常见问题 问题1 Error Could not find artifacts for home wu MetaCoin test
  • Android JetPack学习笔记-DataStore

    通过键值对存储 以异步 一致的事务方式存储数据克服了SharedPreferences的一些缺点 基于kotlin协程的Flow实现 并且可以对SP数据进行迁移 以protobuffer协议进行存储 速度更快 效率更高 使用 引用 impl
  • 实践练习五(可选):对 OceanBase 做性能测试

    第六期直播实践练习 可选 对一个OB集群 带 OBProxy 进行Benchamrk测试 环境准备 由于手上正好有7台物理机 在作业三中会使用OBD直接部署了2 2 2架构的OceanBase集群 这里直接拿来进行TPC C测试 机器信息如
  • Kettle——表输出步骤异常处理方式探究

    开源ETL工具Kettle transformation中的多数步骤都是支持定义错误处理的 为了保证transformation脚本的健壮性 我们会在关键的步骤上进行异常捕获处理 本篇文章以TableOutput步骤来探究kettle异常处
  • QT-信号与槽机制学习笔记

    QT 信号与槽机制学习笔记 一 标准信号和槽 二 自定义信号与槽 2 1 信号与槽的案例 无参数 2 2 有参数的信号与槽案例 三 信号和槽的扩展 四 Qt4的信号和槽函数 五 QDebug的输出转义问题 六 lambda表达式 6 1 简
  • 常见面试题--memcpy()和strcpy()的区别

    前言 memcpy 和strcpy 的区别是常见的面试题 以前面试的时候被问起过 觉得当时回答的不是很好 这里做一下总结 方便自己和有需要的人查看 这个问题主要考查基本能力 这两个都是常见的拷贝函数 C语言程序员都经常会用到 用法都清楚 但
  • Jmeter 配置使用(一)

    Jmeter 简介 Jmeter 下载安装 测试实施 创建线程组 添加Http请求 查看结果树 聚合报告 添加断言
  • 为eclipse添加tomcat插件(eclipse tomcat plugin)

    打开站点 http marketplace eclipse org content eclipse tomcat plugin 把Install拖到打开的eclipse的工作区中 即可下载安装 安装后eclipse将重启 重新打开后可见工具
  • 【转】一篇文章读懂大数据中台架构

    一篇文章读懂大数据中台架构
  • mysql5.7驱动配置

    环境 mysql5 7 url后面需要加上useUnicode true characterEncoding utf8 serverTimezone UTC这几个参数 否则会报错 datasource driver class name c
  • 清风数学建模学习笔记——TOPSIS法(优劣解距离法)

    优劣解距离法 TOPSIS法 Technique for Order Preference by Similarity to Ideal Solution 可翻译为逼近理想解排序法 国内常简称为优劣解距离法 TOPSIS 法是一种常用的 综
  • 银联支付 前端 接收后端数据 写入页面

    如果能够帮到您 烦请给个赞或者评论 不甚感谢 点击确认支付 跳转银联页面 后台传入html 给我 我需要将html append html 放在html 里 html html html html data data union pay h
  • 使用多个路由器有线桥接实现无线漫游

    虽然 WDS 是平价的无线漫游实现最优先考虑的方案 但 WDS 几个路由之间的通信还是无线 无线没有有线稳定这是不争的事实 使用有线桥接来实现无线漫游 各个路由之间的通信通过有线 相对来说理论上要稳定些 示例 三个路由器 一主二从 两个也行
  • libcurl快速入门

    libcurl是一个跨平台的网络协议库 支持http https ftp gopher telnet dict file 和ldap 协议 gt libcurl同样支持HTTPS证书授权 HTTP POST HTTP PUT FTP 上传