libcurl原理解析(1) - 引言

1.引言

在爱立信最近参与的项目是一个数据转发程序,基于http协议。主要使用到了epoll与libcurl这两种技术。

本人负责的是里边的传输模块,也是项目的主要模块。刚好使用到了libcurl这个库,并且用它与epoll进行结合。所以基本上从开始的架构设计,到开发,到性能调试,bug fix,基本贯穿了整个项目开发周期。限于开发进度要求,一直都只是用用libcurl的API,偶尔碰到难题时,会看看官方的document,或者少部分源码。但是,一直都没有好好看看它的内部实现机制。现在项目结束了,可以静下心详细研究下它的内部实现。

2.libcurl介绍

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/

3.方向

本系列的后续文章,主要会专注于下面所列的与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上的实现方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 11:38:24

libcurl原理解析(1) - 引言的相关文章

libcurl原理解析(2) - libcurl对poll的使用

libcurl同时封装了select以及poll这两种I/O机制.代码中使用宏HAVE_POLL_FINE对这两者进行分离.如果定义了这个宏,则使用poll,否则使用select. 这两者的使用代码都定义在函数curl_poll()中,而函数定义在文件lib/select.c中.为了方便分析,阅读,会将select与poll相关的代码分离开来,各自独立分析. 本篇文章主要分析curl_poll()中对poll的封装使用. 先看下使用到的一些数据结构的定义: typedef int curl_so

libcurl实现解析(3) - libcurl对select的使用

1.前言 在本系列的前一篇文章中,介绍了libcurl对poll()的使用.参考"libcurl原理解析(2) - libcurl对poll的使用". 本篇文章主要分析curl_poll()中对select()的封装使用.与前一篇类似,我们只分离出与select相关的代码. 2.curl_poll函数分析 这个函数中使用到的一些其它的数据结构,可以参考前一篇文章中的介绍.本篇不再介绍. /* 这个函数是对poll()的封装.如果poll()不存在,则使用select()替代. 如果使用

你不得不知道的-垃圾回收机制及析构函数原理解析

前言 当学习到Web API中摸索原理时,对于其中有关垃圾回收只是有点印象并未深入去了解其原理并且对索引器用的也很少,所以利用放假期间好好回顾下已经忘记或者遗漏的知识,温故而知新大概就是这道理吧,虽然园子中关于这两者的文章也是多不胜数,但笔者也有自己独特的见解. 垃圾回收机制 引言 我们知道.NET Framework中的对象是创建在托管堆中的,但是像C.C++等其他底层语言中的对象是创建在非托管堆中的,所以在这类语言中就会出现编程人员忘记去释放已经没有用的对象,同时编程人员也可能会去试图访问已

数据库水平切分的实现原理解析

数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式.水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性:通过集群方案,解决了

一篇不一样的docker原理解析

转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率降低不少.而在讲解docker原理上,所有的讲解都是关于cgroups,namespace,aufs以及deviceMapper,这对于一个初学者来说,就是用一堆名词替换另一堆名词,所以我打算写一篇不涉及太多

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

MyBatis框架中Mapper映射配置的使用及原理解析(三) 配置篇 Configuration

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象. Configuration类主要是用来存储对Mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个Mybatis的执行流程,为Mybatis的执行过程提供必要的配

MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder

在 <MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 的demo中看到了SessionFactory的创建过程: SqlSessionFactory sessionFactory = null; String resource = "mybatisConfig.xml"; try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources .getResourceAsRea