axel源码学习(1)——重要流程细节
前面一篇文章的流程太过于简单,基本没有触及到axel的核心,因此本文将要把axel中的几个重要的主要的操作流程单独弄出来看看,还是按照main函数的执行顺序来展开,略去错误处理之类的流程仅仅着眼于最重要的内容。
命令参数解析
命令参数解析的源码用switch-case语句实现非常清晰明了,只要对照axel的用法很容易看懂,因此这里不再详细分析了。
search
前面说过,axel支持搜索镜像站点,从多个地址下载同一个文件,如果使用了[-S]选项的话将进行search的操作。
图 1.1 search mirror 过程
如图 1.1所示的search过程简图,如果命令行传入-S x参数,便执行search mirror过程,搜索的核心是search_makelist()函数,这个函数将调用conn.c中的相关连接操作,获取mirror的列表并存储。然后将调用search_getspeeds函数测试各个mirror的速度,search_sortlist将其排序,最后在创建axel数据结构时(也就是准备下载)传入的地址参数是这个search的结果列表。如果没有要求search过程的话,传入的地址url将是用户在命令行参数输入的url。
创建axel_t structure
在后面介绍axel的主要数据结构的时候会提到,实际上axel下载的主体是axel_t结构体,因此在下载之前都会创建这个结构体并对其进行一些相关操作。axel_new()函数传入三个参数,根据参数来设置axel_t结构体,程序流程很简单,关键是要理解操作的意义,这就需要了解axel_t结构体的成员情况,在这儿先不展开。
axel_start
在准备工作都做好了之后,便要真正准备下载了,要将网络上的文件下载下来,需要在本地打开一个文件然后向文件写入下载的数据,这个过程由函数axel_open完成。axel_open()函数中调用了axel_divide()函数来为每一个连接分割文件位置,这个就是axel支持多连接的实现细节。整个之前的过程完成之后,axel_start开始下载,但是实际上axel_start中并没有真正在下载,axel_start只是rescan了url、创建了线程及记录开始时间。
axel_do
axel下载的重头戏axel_do来了,它所完成的是下载过程的主要工作。
图 1.2 axel_do 的大致流程
axel_do函数中使用了select函数来等待各个连接上的数据,select函数将在另一篇文章中介绍。
axel源码学习(1)——重要流程细节的更多相关文章
- axel源码学习(0)——程序逻辑
axel简介 axel是一个命令行下的轻量级http/ftp 下载加速工具,支持多线程下载和断点续传,支持从多个镜像下载同一文件. axel的用法如下: 图 0.1 axel usage axel 粗 ...
- Mybatis源码学习第六天(核心流程分析)之Executor分析
今Executor这个类,Mybatis虽然表面是SqlSession做的增删改查,其实底层统一调用的是Executor这个接口 在这里贴一下Mybatis查询体系结构图 Executor组件分析 E ...
- redis源码学习之工作流程初探
目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...
- Netty 源码学习——服务端流程分析
在上一篇我们已经介绍了客户端的流程分析,我们已经对启动已经大体上有了一定的认识,现在我们继续看对服务端的流程来看一看到底有什么区别. 服务端代码 public class NioServer { pr ...
- Mybatis源码学习第六天(核心流程分析)之Executor分析(补充)
补充上一章没有讲解的三个Executor执行器; 还是贴一下之前的代码吧;我发现其实有些分析注释还是写在代码里面比较好,方便大家理解,之前是我的疏忽,不好意思 @Override public < ...
- redis源码学习之slowlog
目录 背景 环境说明 redis执行命令流程 记录slowlog源码分析 制造一条slowlog slowlog分析 1.slowlog如何开启 2.slowlog数量限制 3.slowlog中的耗时 ...
- Netty 源码学习——客户端流程分析
Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...
- SpringMVC源码学习之request处理流程
目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...
- mybatis源码学习:插件定义+执行流程责任链
目录 一.自定义插件流程 二.测试插件 三.源码分析 1.inteceptor在Configuration中的注册 2.基于责任链的设计模式 3.基于动态代理的plugin 4.拦截方法的interc ...
随机推荐
- POJ 1655-Balancing Act(树形dp)
题意: 求n个节点的树中哪个节点删除以后得到的最大连通分量最小. 分析:同上题 #include <map> #include <set> #include <list& ...
- myeclipse10 安装 testng插件
下载插件: http://pan.baidu.com/s/1c0pghFE 放到dropins目录
- [GRYZ2015]阿Q的停车场
题目描述 刚拿到驾照的KJ 总喜欢开着车到处兜风,玩完了再把车停到阿Q的停车场里,虽然她对自己停车的水平很有信心,但她还是不放心其他人的停车水平,尤其是Kelukin.于是,她每次都把自己的爱车停在距 ...
- htmlcss笔记--a
a标签 1.下载:href里面放一个文件或者压缩包时,会下载: 2.锚点:跳转到锚点: href="#id" 跳转到的模块添加一个id,点击id就会跳转到该模块. html标签: ...
- adb不响应
1.CMD命令窗口输入:adb nodaemon server .然后就会提示你哪个端口被占用了. 2.输入netstat -ano | findstr "5037" .然后会弹出 ...
- SQL2008-查询库中是否存在某表
select * from sysobjects where name= 'N201111B' and xtype= 'U'
- 转载 VPN介绍
转载原地址: http://aajs800.blog.51cto.com/519255/239724 原作者 aajs800 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
- 理解js中的原型链,prototype与__proto__的关系
说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...
- JavaScript要点(九)HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...
- java Swing图形化界面
学过java的人应该对java的图形化界面很是反感,特别是接触java不久的人.如果想和其他语言那样用鼠标拖拽,可以使用wondosbulider插件.但是用起来也不是那么方便.当然对于不乐意写代码的 ...