Libcurl笔记五_easy模式运行原理
1,
curl_easy_init内部调用Curl_open创建一个结构体SessionHandle(里面包含了所以curl使用的数据和指针)并初始化一些数据,然后返回将其作为给外侧使用的句柄CURL*。
2,
curl_easy_setopt调用Curl_setopt,其内部一个switch,case所有支持的参数来设置上面init的SessionHandle中相应数据。
3,curl_easy_perform内部会创建一个multi结构并让其与相互指向
multi = data->multi_easy;
data->multi = multi;
static
CURLcode easy_perform(struct
SessionHandle *data, bool
events)
{
CURLM *multi;
CURLMcode mcode;
if(data->multi) {
failf(data, "easy handle already used in multi handle");
return CURLE_FAILED_INIT;
}
if(data->multi_easy)
multi = data->multi_easy;
else {
/* this multi handle will only ever have a single easy handled attached
to it, so make it use minimal hashes */
multi = Curl_multi_handle(1, 3);
if(!multi)
return CURLE_OUT_OF_MEMORY;
data->multi_easy = multi;
}
mcode = curl_multi_add_handle(multi, data);
data->multi = multi;
/* run the transfer */
result = events ? easy_events(multi) : easy_transfer(multi);
(void)curl_multi_remove_handle(multi, data);
return result;
}
4,curl_multi_perform内部由multi_runsingle执行真正的一些列http操作。
multi_runsingle由一个while循环内不断的switch-case 20种 CURLMstate状态执行相应操作并指定下一个状态传递操作直到结束。
static
CURLMcode multi_runsingle(struct
Curl_multi *multi,
struct
timeval
now,
struct
SessionHandle *data)
{
do {
switch(data->mstate) {
case CURLM_STATE_INIT:
result=Curl_pretransfer(data);
multistate(data, CURLM_STATE_CONNECT);
break;
case CURLM_STATE_CONNECT:
result = Curl_connect(data, &data->easy_conn,
&async, &protocol_connect);
multistate(data, CURLM_STATE_CONNECT_PEND);
break;
case CURLM_STATE_WAITCONNECT:
result = Curl_is_connected(data->easy_conn, FIRSTSOCKET, &connected);
multistate(data, data->easy_conn->bits.tunnel_proxy?
CURLM_STATE_WAITPROXYCONNECT:
CURLM_STATE_SENDPROTOCONNECT);
break;
case CURLM_STATE_PERFORM:
result = Curl_readwrite(data->easy_conn, data, &done);
multistate(data, CURLM_STATE_DONE);
break;
}while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE))
}
5,
case CURLM_STATE_INIT:
创建连接数据并初始化之
case CURLM_STATE_CONNECT:
为上面创建的连接结构绑定socket
case CURLM_STATE_WAITCONNECT:
使用select模型开始socket操作
case CURLM_STATE_PERFORM:
收到数据了,使用之前easy_setopt设置在SessionHandle结构中的回调函数写数据。
6,curl_easy_cleanup清空SessionHandle结构,
当然会先调用curl_multi_cleanup清空关联的multi结构。
Libcurl笔记五_easy模式运行原理的更多相关文章
- SQL学习笔记五之MySQL索引原理与慢查询优化
阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢 ...
- 梳理 Opengl ES 3.0 (五)shader运行原理
先来看看一张图 shader都是在运行时编译和执行的,每个shader都有一个main函数作为它的入口. vertex shader的功能有两个:一个是计算顶点坐标变换,另一个就是为片元shader计 ...
- .NET CORE学习笔记系列(5)——ASP.NET CORE的运行原理解析
一.概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管,初始化过程中触发HttpApplicat ...
- Flink 集群运行原理兼部署及Yarn运行模式深入剖析
1 Flink的前世今生(生态很重要) 原文:https://blog.csdn.net/shenshouniu/article/details/84439459 很多人可能都是在 2015 年才听到 ...
- Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗
1. Java程序运行原理: Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...
- Android开发学习笔记(二)——编译和运行原理(1)
http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...
- RabbitMQ传输原理、五种模式
本文代码基于SpringBoot,文末有代码连接 .首先是一些在Spring Boot的一些配置和概念,然后跟随代码看下五种模式 MQ两种消息传输方式,点对点(代码中的简单传递模式),发布/订阅(代码 ...
- Web程序的运行原理及流程(一)
自己做Web程序的开发也有两年多了 从最开始跟风学框架 到第一用上框架的欣喜若狂 我相信每个程序员都是这样过来的 在大学学习一门语言 学会后往往很想做一个实际的项目出来 我当时第一次做WEB项目看 ...
- 【转载】Spark系列之运行原理和架构
参考 http://www.cnblogs.com/shishanyuan/p/4721326.html 1. Spark运行架构 1.1 术语定义 lApplication:Spark Applic ...
随机推荐
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- FlashBuilder精选插件
1.Easy Explorer:打开在eclipse中选定文件所在的目录.这是一个非常不错的插件,有了它,你就可以随时跳到你指定文件的目录了.地址:http://sourceforge.net/pro ...
- MySQL · BUG分析 · Rename table 死锁分析
http://mysql.taobao.org/monthly/2016/03/06/ 背景 InnoDB buffer pool中的page管理牵涉到两个链表,一个是lru链表,一个是flush 脏 ...
- pt-table-checksum 与pt-table-sync
http://www.lai18.com/user/481193.html?id=481193&p=1 主从数据校验使用percona-toolkit工具集的以下两个工具(主库上使用): pt ...
- 搭建属于自己的wiki
1.开源wiki mediawiki http://www.mediawiki.org/wiki/MediaWiki 2. 开发文档 http://www.mediawiki.org/wiki/Man ...
- c语言排序算法总结
一.希尔(Shell)排序法 /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) { int gap,i,j, ...
- [django]自定义全局context
1. 创建一个context processor函数 新建一个文件命名为custom_processors.py,把它放到项目app文件夹(例如我的blog文件夹),添加一个返回字典的函数,其代码如下 ...
- Apache配置文件中的deny与allow小结
今天在公司配置Zend本地Apache环境的时候,发现在zend.conf中的权限控制中的几段句子,如下所示: 复制代码代码如下: <Location /server-status> ...
- dede只调用当天发布的文档
dede只调用当天发布的文档 dede文章的调用 我需要织梦的模板分别调用,一天内发布的文章,三天内发布的文章,和七天内发布的文章,请问是代码是怎么写的,如何调用,如图所示. 点一天内,显示最近24的 ...
- Windows Embedded CE 6.0开发环境的搭建
最近开始在学习嵌入式,在这里首先得安装Windows Embedded CE 6.0,其中遇到了很多问题,电脑的系统以及相关配置都会在安装过程中受到影响,因此笔者就安装中的问题以及环境搭建来介绍一下. ...