Libcurl笔记五_easy模式运行原理

时间:2021-11-30 20:56:30

1,
Libcurl笔记五_easy模式运行原理

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:
创建连接数据并初始化之
Libcurl笔记五_easy模式运行原理

case CURLM_STATE_CONNECT:
为上面创建的连接结构绑定socket
Libcurl笔记五_easy模式运行原理

case CURLM_STATE_WAITCONNECT:
使用select模型开始socket操作
Libcurl笔记五_easy模式运行原理

case CURLM_STATE_PERFORM:
收到数据了,使用之前easy_setopt设置在SessionHandle结构中的回调函数写数据。
Libcurl笔记五_easy模式运行原理

6,curl_easy_cleanup清空SessionHandle结构,
当然会先调用curl_multi_cleanup清空关联的multi结构。

Libcurl笔记五_easy模式运行原理的更多相关文章

  1. SQL学习笔记五之MySQL索引原理与慢查询优化

    阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢 ...

  2. 梳理 Opengl ES 3.0 (五)shader运行原理

    先来看看一张图 shader都是在运行时编译和执行的,每个shader都有一个main函数作为它的入口. vertex shader的功能有两个:一个是计算顶点坐标变换,另一个就是为片元shader计 ...

  3. .NET CORE学习笔记系列(5)——ASP.NET CORE的运行原理解析

    一.概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管,初始化过程中触发HttpApplicat ...

  4. Flink 集群运行原理兼部署及Yarn运行模式深入剖析

    1 Flink的前世今生(生态很重要) 原文:https://blog.csdn.net/shenshouniu/article/details/84439459 很多人可能都是在 2015 年才听到 ...

  5. Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗

    1. Java程序运行原理:     Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...

  6. Android开发学习笔记(二)——编译和运行原理(1)

    http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...

  7. RabbitMQ传输原理、五种模式

    本文代码基于SpringBoot,文末有代码连接 .首先是一些在Spring Boot的一些配置和概念,然后跟随代码看下五种模式 MQ两种消息传输方式,点对点(代码中的简单传递模式),发布/订阅(代码 ...

  8. Web程序的运行原理及流程(一)

    自己做Web程序的开发也有两年多了 从最开始跟风学框架  到第一用上框架的欣喜若狂 我相信每个程序员都是这样过来的 在大学学习一门语言 学会后往往很想做一个实际的项目出来  我当时第一次做WEB项目看 ...

  9. 【转载】Spark系列之运行原理和架构

    参考 http://www.cnblogs.com/shishanyuan/p/4721326.html 1. Spark运行架构 1.1 术语定义 lApplication:Spark Applic ...

随机推荐

  1. BFC,定位,浮动,7种垂直居中方法

    目录 一.BFC与IFC 1.1.BFC与IFC概要 1.2.如何产生BFC 1.3.BFC的作用与特点 二.定位 2.2.relative 2.3.absolute 2.4.fixed 2.5.z- ...

  2. web前端防治重复提交

    web前端开发中防治重复提交 web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表 ...

  3. Ubuntu Server 16.04下ASP.NET Core Web Api + MySql + Dapper在 Jexus、nginx 下的简单测试

    一.环境及工具 1.服务器 VirtualBox5.1.4 安装 Ubuntu Server 16.04 amd64 MySql Ver 14.14 Distrib 5.6.21 Jexus 5.8. ...

  4. 【代码笔记】iOS-改变导航条标题的颜色为红色

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  5. CheckStyle, 强制你遵循编码规范

    如今代码静态检查越来越重要,已经成为构建高质量软件的不可或缺的一个验证步骤.如果你使用的是java语言,那么CheckStyle则是一个利器. CheckStyle能够帮助程序员检查代码是否符合制定的 ...

  6. js获取字符串最后一个字符代码

    方法一:运用String对象下的charAt方法 charAt() 方法可返回指定位置的字符. 代码如下 复制代码 str.charAt(str.length – 1) 请注意,JavaScript ...

  7. js中的时间转换—毫秒转换成日期时间

    转自:http://www.javascript100.com/?p=181 前几天,在项目中遇到js时间增加问题,要将js毫秒时间转换成日期时间 var oldTime = (new Date(&q ...

  8. ThinPHP第二十八天(F函数和file_put_contents区别|PHP生成PHP文件,Kindeditor编辑器使用方法)

    1.F(name,data,path)函数和file_put_contents(file,str)区别 F函数直接生成<?php ?>格式的php文件了,将data加入到<?php和 ...

  9. 「mysql优化专题」90&percnt;程序员没听过的存储过程和存储函数教学&lpar;7&rpar;

    一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...

  10. Python设计模式 - 基础 - 封装 &amp&semi; 继承 &amp&semi; 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...