0
点赞
收藏
分享

微信扫一扫

libcurl入门之简介

何晓杰Dev 2022-01-31 阅读 118

1 简介

1.1 支持协议

DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. curl 支持 SSL 认证, libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。

libcurl是高度可移植的, 它可以在很多平台上编译和运行, 包括Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS 等等...

libcurl是免费的,线程安全的,IPv6兼容,特性丰富,快速并且已经被很多成功知名的大公司应用。

1.2 参考网址

1.2.1 libcurl网站的入口

https://curl.se/libcurl/

1.2.2 《Everything curl 》书网页版,其中libcurl basics和HTTP with libcurl章节对编程有很大的参考意义

https://everything.curl.dev/

1.2.3 libcurl的编程示例,常用的功能都有例程源码

https://curl.se/libcurl/c/example.html

1.2.4 curl_easy_setopt()函数的选项说明

https://curl.se/libcurl/c/curl_easy_setopt.html

2 Easy和Multi

Easy接口是同步的,高效的,可以快速应用,大量的应用是基于这些接口的。Multi接口功能上和Easy没有区别,但是Multi是异步的,Easy同步的,也就是说只能一次完成一个传输,要想开始新的传输,就得等之前的传输完成,有点类似Linux中的阻塞执行。相反Multi是异步的有点类似非阻塞执行,就像Linux下使用select或者poll在单线程下,实现多路复用的功能。我自己觉得Easy更常用,如果需要多次执行可以使用Easy结合多线程编程,libcurl是线程安全的。我的文章也是重点介绍Easy相关的接口,不介绍Multi接口。

3 Easy接口的使用

第一步 使用curl_easy_init()初始化你的easy会话(easy-session) 并且可以获得一个句柄(handle),这个句柄作为其他Easy接口函数的输入参数。

第二步 使用curl_easy_setopt()设置一些传输相关选项,最重要的就是URL,然后可以设置一些回调函数,当数据有效时,这些回调函数可以被调用。这个函数非常要,有点类似Linux下的ioctl()函数,后面会结合例子说明。

第三步 设置好所有的参数以后,调用curl_easy_perform()去执行这个传输,这个函数会执行所有的操作,直到执行完以后或者出错了返回,所以这个函数是阻塞执行的,也就是同步执行的。

第四步 执行完成以后,你也可以使用curl_easy_getinfo()获取传输相关的信息,比如获取整个传输用了多长时间。

第五步 当所有传输结束以后可以调用curl_easy_cleanup()释放之前申请的会话。

当然在使用上面这些函数之前需要对整个库进行初始化,用到的函数就是curl_global_init(),整个库都不再使用了或者程序要结束了调用curl_global_cleanup()去释放所有资源。

4 其他常用接口

除了常用的传输相关的函数还有一些常用的辅助函数:

curl_version()    返回libcurl版本相关信息的指针 curl_getdate()    转换一个日期 string 到 time_t curl_mime_init()    一些mime系列函数对于HTTP POST表单的操作 curl_formadd()    也是HTTP POST表单的操作,但是这个接口比较老了 curl_slist_append()    建立一个清单的链表,最常用的就是HTTP头的添加和删除。 curl_slist_free_all()    释放通过curl_slist_append()创建的curl_slist curl_easy_escape()    URL编码 curl_easy_unescape()    URL解码

5 总结

这篇文章只是简单的对libcurl的一个整体介绍,后面针对具体的函数和例程进行讲解

举报

相关推荐

0 条评论