CURL开源库的学习及编程

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

CURL开源库的学习及编程

1、CURL的下载及编译

CURL的安装及编译,详情查看此博主的博客
2019的安装及编译的指南博客

1.1Libcurl函数的介绍

首先调用curl_global_init()初始化libcurl
然后调用curl_easy_init()函数得到easy interface型的指针
调用curl_easyz_setop()t设置传输选项
调用curl_easyz_perform()函数完成传输任务
调用curl_easy_cleanup()释放内存

2、Libcurl的简单界面的函数

2.1初始化libcurl curl_global_init()

调用curl_global_init()这个函数只能用一次
(但是在调用完curl_global_cleanup函数后仍然可以使用)
如果此函数在curl_easy_init函数调用时还没调用,它由libcurl库自动调用,多线程调用此函数以防止在线程中curl_easy_init多次调用

curl_global_init()不能保证线程安全,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中

2.2使用简单的函数获得句柄

curl_easy_init()获得句柄

2.3设置传输选项curl_easy_setopt()

curl所有的设置都是在该函数中完成的
由于setopt()函数有较多选项,在这里不进行一一介绍
详细选项情况查看
API curl C

curl_easy_setopt(CURL *handle, CURLOPT_URL , char *URL); 传入指向要使用的URL的指针

返回值,当返回成功的时候CURLE_OK,如果堆空间不足,则返回CURL_OUT_OF_MEMORY
curl_easy_setopt不会解析给定的字符串,如果给出一个错误的网址,在调用curl_easy_perform或类似内容之前不会检测到它

curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback); 用于写入接收数据的回调

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);函数原型
将指针传递给回调函数,该函数应与上面显示的原型匹配
函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能

curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);传递给写入回调的指针

要传递给写入回调的数据指针
如果没用通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出,当然也可以通过CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里

curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION, header_callback);接收标头数据的回调

size_t header_callback(char *buffer,size_t size, size_t nitems,void *userdata);函数原型
将指针传递给回调函数,该函数与上面显示的原型匹配
libcurl一旦接收到http头部数据后将调用该函数
每个标头将调用一次标头回调,并且将完整的标头行传递给回调

curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);传递到标头回调的指针

传递一个指针,用于件接收数据的标头部分写入其中

curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback);读取数据上传的回调

size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata);函数原型
将指针传递给回调函数,如上面的原型所示
这个回调函数在需要读取数据以便将其发送到对等方时立即被libcurl调用

curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);传递给读取回调的指针

要传递给文件读取函数的数据指针

curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION,progress_callback);进度表回调

int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal,double ulnow);函数原型
该函数由ibcurl调用,而不是以频繁的间隔调用

curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);允许传输完成的最长时间

传递包含超时的long as 参数,允许libcurl传输操作花费的最长时间,

curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);重定向URL

设置为1的长参数告诉库遵循服务器在3XX响应中作为HTTP标头的一部分发送的任何location标头

2.4同步执行文件传输curl_easy_perform(CURL *easy_handle);

以阻塞方式执行整个请求,并在完成后返回,如果失败,则更早返回

2.5结束一个libcurl curl_easy_cleanup(CURL *handle);

2.6重置一个libcurl会话句柄的所有选项 curl_easy_reset(CURL *handle);

将以前在指定CURL句柄上设置的所有选项重新初始化为默认值,这会将句柄恢复到与刚刚使用curl_easy_init创建句柄时相同的状态

2.7返回错误代码的字符串 const char *curl_easy_strerror(CURLcode errornum);

fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));

3、Libcurl的多接口的函数

如何把curl源代码编译进入代码中,开源,学习,mfc

3.1 CURLM *curl_multi_init();创建多控点

此函数返回指向CURLM句柄的指针,以用作所有其他多功能函数的输入

multi_handle = curl_multi_init();

3.2curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);向多堆栈添加标准的简易手柄

3.3curl_multi_perform(CURLM *multi_handle, int *running_handles);从简单的句柄读取/写入可用数据

此函数以非阻塞方式对所有需要注意的添加句柄执行传输

int still_running;
do {
  CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
  if(!mc && still_running)
    /* wait for activity, timeout or "nothing" */
    mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
  if(mc) {
    fprintf(stderr, "curl_multi_poll() failed, code %d.\n", (int)mc);
    break;
  }
 
/* if there are still transfers, loop! */
} while(still_running);

3.4CURLMsg *curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue);

询问多句柄是否有来自各个传输的消息
消息可能包含传输中的错误代码或仅传输已完成的事实

 int msgq = 0;
  m = curl_multi_info_read(multi_handle, &msgq);

3.5CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);从多会话中删除简单句柄

从multi_handle中删除给定的easy_handle
这将使得指定的简易句柄从此多句柄的控件中删除

  curl_multi_remove_handle(multi_handle, msg->easy_handle);

3.6 void curl_easy_cleanup(CURL *handle);结束一个libcurl

4、Libcurl的共享接口的函数

添加了共享接口允许在curl句柄之间共享数据
一组数据-多次传输:可以使得多个简易句柄之间共享数据,他们更新并使用相同的cookie数据库
使用curl_share_init创建共享对象,返回新的创建句柄
可以使用curl_share_setopt告诉共享对象您希望它共享哪些数据
制作简单句柄来使用此共享,curl_easy_setopt设置CURLOPT_SHARE选项,并传入共享句柄,可以使任意数量的简易句柄共享相同的共享句柄
若要终止共享特定的数据,则可以使用CURLSHOPT_UNSHARE

4.1CURLSH *curl_share_init();此函数返回指向CURLSH句柄,已用作所有其他共享函数的输入,有时在文档中的某些位置称为共享句柄

curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);

4.2CURLSHcode curl_share_setopt(CURLSH *share, CURLSHoption option, parameter);设置共享对象的选项

将选项设置为给定共享的参数

4.3CURLSHcode curl_share_setopt(CURLSH *share, CURLSHOPT_LOCKFUNC, lockcb);互斥锁回调

为共享对象设置互斥锁回调,以允许多个线程同时使用它
再次释放互斥锁时会调用相应的CURLSHOPT_UNLOCKFUNC回调

5、Libcurl的网络地址解析接口

URL接口提供用于解析和生成URL的函数

5.1 创建一个句柄,其中包含URL信息和资源

CURLU *h = curl_url();

5.2 完成后,用curl_url_cleanup清理它

curl_url_cleanup(h);
//函数原型
void curl_url_cleanup(CURLU *handle);

5.3 需要句柄的副本的时候,使用curl_url_dup 复制它

CURLU *nh = curl_url_dup(h);
函数原型

复制给定的CURLU句柄及其所有内容,并返回指向新CURLU句柄的指针,新手柄也需要通过curl_url_cleanup释放

5.4 解析和重定向

通过使用 curl_url_set 将URL设置为句柄,将分析该URL并将其存储在句柄中
CURLUcode curl_url_set(CURLU *url,CURLUPart part,const char *content,unsigned int flags)

部件
CURLUPART_URL
CURLUPART_SCHEME
CURLUPART_USER
CURLUPART_PASSWORD
CURLUPART_OPTIONS
CURLUPART_HOST
CURLUPART_PORT
CURLUPART_PORT

5.5获取网址

CURLU句柄表示一个URL,可以使用curl_url_get轻松提取

 char *url;
  rc = curl_url_get(h, CURLUPART_URL, &url, 0);
  curl_free(url);

CURLUcode curl_url_get(CURLU *url,CURLUPart what,char **part,unsigned int flags)函数原型
部件 :CURLUPART_URL
CURLUPART_USER
CURLUPART_OPTIONS 是一个可选字段,仅在解析以下方案的URL事识别/使用它
CURLUPART_PASSWORD
CURLUPART_USER
CURLUPART_SCHEME
CURLUPART_HOST 主机名,如果是IPV6数字地址,则区域ID将不是其中的一部分
IPV6名称在设置时会规范化,这将使他们尽可能短,同时保持正确的语法
CURLUPART_PATH 即使URL中未提供路径,该部分也将为/
CURLUPART_PORT 端口不能在获取时进行URL解码,与其他部分一样,此数字以字符串形式返回文章来源地址https://www.toymoban.com/news/detail-858542.html

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

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

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

相关文章

  • 开源源代码收集下载网站汇总

    0.中国站长(免费):https://down.chinaz.com/ 1.51源码:http://www.51aspx.com/ https://wwwtest.51aspx.com/ 2.源码之家:http://www.codejia.com/ 3.源码之家:http://www.zzvips.com/ 4.https://sourceforge.net/ 5.https://www.80zhan.com/ 6.洪越源代码:http://www.softhy.net/ 8.代码爱好者:http://www.codefans.com/ 24.源码网:http:

    2024年02月05日
    浏览(69)
  • Matlab编程中常用到各种数学符号和特殊字符,如希腊字母、上下标、箭头符号等。在此,我们介绍如何在Matlab中快速输入这些符号,并提供相应的源代码示例。

    Matlab编程中常用到各种数学符号和特殊字符,如希腊字母、上下标、箭头符号等。在此,我们介绍如何在Matlab中快速输入这些符号,并提供相应的源代码示例。 希腊字母: Matlab中快速输入希腊字母,可以使用latex风格的命令。例如: alpha 输入alpha,即可输入希腊字母α beta

    2024年02月14日
    浏览(41)
  • Windows如何安装使用curl命令

    个人主页 : ζ小菜鸡 大家好我是ζ小菜鸡,让我们一起学习Windows如何安装使用curl命令。 如果文章对你有帮助、 欢迎关注、点赞、收藏(一键三连)   curl命令网络应用curl命令是一个利用URL规则在命令行下工作的文件传输工具。   CURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、

    2024年02月12日
    浏览(40)
  • 如何使用curl下载github代码

    首先通过chrome打开想要下载的源文件 如图,有那个下载图标时表示不需要鉴权即可下载,一般仓库都会开放只读权限,所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中,按下F12打开网络,点击下载图标 上图为文件所在位置 使用如下命令进行下

    2024年02月16日
    浏览(36)
  • 【开源鸿蒙】下载 OpenHarmony 4.0 源代码和工具链

    本文介绍了如何下载开源鸿蒙(OpenHarmony)操作系统源码,该方法可以用于下载OpenHarmony最新开发版本(master分支)或者4.0 Release、3.2 Release等发布版本。 本文基于Ubuntu 22.04进行操作,Ubuntu其他版本也同样可行,包括 20.04, 18.04。 OpenHarmony架构图: 本节介绍如何准备命令行工具

    2024年04月13日
    浏览(87)
  • 抖音seo源码-源代码开发搭建-开源部署(不加密)

    抖音SEO矩阵系统源码开发功能模型是指在抖音平台上提高视频搜索排名的一种算法模型。该功能模型包括多个部分,如内容优化、用户交互、社交化推广等,通过对这些因素的优化和提升,达到提高视频搜索排名的目的。具体实现包括使用、标签等优化内容,提高用户

    2024年02月09日
    浏览(55)
  • 抖音seo源码-源代码开发搭建-开源部署操作日志

      抖音seo源码开发是一项非常重要的技术,在抖音上,有很多视频,如果你想让自己的视频脱颖而出,那么就需要优化自己的seo源码。不过,为了保护用户的隐私,抖音并不公开其seo算法的细节,因此需要开发者自己探索。抖音SEO矩阵系统源码开发功能模型是指在抖音平台上

    2024年02月13日
    浏览(47)
  • 【Spark编程基础】实验三RDD 编程初级实践(附源代码)

    1、熟悉 Spark 的 RDD 基本操作及键值对操作; 2、熟悉使用 RDD 编程解决实际具体问题的方法 1、Scala 版本为 2.11.8。 2、操作系统:linux(推荐使用Ubuntu16.04)。 3、Jdk版本:1.7或以上版本。 请到本教程官网的“下载专区”的“数据集”中下载 chapter5-data1.txt,该数据集包含了某大

    2024年03月25日
    浏览(56)
  • 智能送药小车完整版【电赛、课设】开源(含源代码)

    目录 任务要求 摘要 1、前言 2、系统方案设计 3、理论分析与计算 3.1 病房选择: 3.2 电机引脚及状态 3.3 灰度传感器及电机状态 4、系统电路设计与仿真 4.1系统硬件框图 4.2 单片机最小板电路 4.3 驱动电路设计 4.4 灰度传感器设计 5、系统软件设计 6、系统测试及结果分析 6.1 系

    2024年02月09日
    浏览(49)
  • ​ | AI顶会论文很多附带源代码?不少是假开源!

    看到一篇绝佳的AI论文,非常期待作者能提供源代码,全文搜索HTTP,可惜出来的都不是源代码的链接。好不容易碰到一篇附带源代码的论文,点进去却是大大的404。终于发现某个不是404的源代码仓库,结果只是放上了几句说明,写着“代码coming soon”,然后一等就是一万年.

    2023年04月24日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包