在爱立信最近参与的项目是一个数据转发程序,基于http协议。主要使用到了epoll与libcurl这两种技术。
本人负责的是里边的传输模块,也是项目的主要模块。刚好使用到了libcurl这个库,并且用它与epoll进行结合。所以基本上从开始的架构设计,到开发,到性能调试,bug fix,基本贯穿了整个项目开发周期。限于开发进度要求,一直都只是用用libcurl的API,偶尔碰到难题时,会看看官方的document,或者少部分源码。但是,一直都没有好好看看它的内部实现机制。现在项目结束了,可以静下心详细研究下它的内部实现。
libcurl是一个开源的客户端url传输库,支持众多的协议,包括DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP等。
libcurl支持SSL证书, HTTP POST, HTTP PUT,FTP上传,基于表单的HTTP上传、代理、HTTP/2、cookies、用户名+密码认证(Basic, Plain, Digest, NTLM等)、下载/上传文件的断点续传,http代理服务器管道等。
libcurl是高度可移植的,可以工作在不同的平台上,支持Windows,Unix,Linux等。
libcurl是免费的,线程安全的,IPV6兼容的,同时它还有很多其他非常丰富的特性。libcurl已经被很多知名的大企业以及应用程序所采用。
相关的文档以及源码可以参考官方链接:http://curl.haxx.se/libcurl/
本系列的后续文章,主要会专注于下面所列的与libcurl相关的主题:
1).libcurl中对select()&poll()的使用方法。
2).libcurl中最重要的easy curl与multi curl的原理,架构,以及它们之间的交互机制。
3).探讨一些重要的回调函数的实现机制。例如:
easy curl中的
CURLOPT_WRITEFUNCTION,
CURLOPT_READFUNCTION,
CURLOPT_IOCTLFUNCTION,
CURLOPT_SEEKFUNCTION,
CURLOPT_SOCKOPTFUNCTION,
CURLOPT_OPENSOCKETFUNCTION,
CURLOPT_CLOSESOCKETFUNCTION,
CURLOPT_PROGRESSFUNCTION.
以及multi curl中的
CURLMOPT_SOCKETFUNCTION,
CURLMOPT_TIMERFUNCTION.
4).探讨一些重要的easy curl option以及multi curl option在底层socket上的实现方式。