前面一篇文章的流程太过于简单,基本没有触及到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)——重要流程细节的更多相关文章

  1. axel源码学习(0)——程序逻辑

    axel简介 axel是一个命令行下的轻量级http/ftp 下载加速工具,支持多线程下载和断点续传,支持从多个镜像下载同一文件. axel的用法如下: 图 0.1 axel usage axel 粗 ...

  2. Mybatis源码学习第六天(核心流程分析)之Executor分析

    今Executor这个类,Mybatis虽然表面是SqlSession做的增删改查,其实底层统一调用的是Executor这个接口 在这里贴一下Mybatis查询体系结构图 Executor组件分析 E ...

  3. redis源码学习之工作流程初探

    目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...

  4. Netty 源码学习——服务端流程分析

    在上一篇我们已经介绍了客户端的流程分析,我们已经对启动已经大体上有了一定的认识,现在我们继续看对服务端的流程来看一看到底有什么区别. 服务端代码 public class NioServer { pr ...

  5. Mybatis源码学习第六天(核心流程分析)之Executor分析(补充)

    补充上一章没有讲解的三个Executor执行器; 还是贴一下之前的代码吧;我发现其实有些分析注释还是写在代码里面比较好,方便大家理解,之前是我的疏忽,不好意思 @Override public < ...

  6. redis源码学习之slowlog

    目录 背景 环境说明 redis执行命令流程 记录slowlog源码分析 制造一条slowlog slowlog分析 1.slowlog如何开启 2.slowlog数量限制 3.slowlog中的耗时 ...

  7. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  8. SpringMVC源码学习之request处理流程

    目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...

  9. mybatis源码学习:插件定义+执行流程责任链

    目录 一.自定义插件流程 二.测试插件 三.源码分析 1.inteceptor在Configuration中的注册 2.基于责任链的设计模式 3.基于动态代理的plugin 4.拦截方法的interc ...

随机推荐

  1. cdn是什么和作用有些

    内容分发网络其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服务器所构 成的在现有的互联网基础之上的一层智能虚拟网络,CDN系 ...

  2. 8、四大组件之三-ContentProvider

    课程目标: 理解ContentProvider的作用及好处 认清ContentProvider与数据存储的关系 掌握ContentProvider对外提供的数据模型形式 能够编写ContentReso ...

  3. MySQL在线备份与恢复工具 --> Xtrabackup

    1 Xtrabackup原理简介 xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品.  ...

  4. MapReduce概述,原理,执行过程

    MapReduce概述 MapReduce是一种分布式计算模型,运行时不会在一台机器上运行.hadoop是分布式的,它是运行在很多的TaskTracker之上的. 在我们的TaskTracker上面跑 ...

  5. Spring MVC整合logback日志框架实战

    1.引入依赖,本项目maven构建,普通项目导入想要的jar包即可 版本 <properties> <slf4j-api.version>1.7.7</slf4j-api ...

  6. jqgrid单元格设置空值的方法

    项目中使用jqgrid,在使用的场景下经常需要清空单元格内容,于是使用了下面的代码: $("#jqgrid1").jqGrid('setCell',rowId, 'column', ...

  7. Java网络编程(模拟浏览器访问Tomcat服务器)

    程序运行结果: HTTP/1.1 404 Not FoundServer: Apache-Coyote/1.1Content-Type: text/html;charset=utf-8Content- ...

  8. jquery foreach

    <form id="input_iForm" action="${pageContext.request.contextPath}/transfer/input_s ...

  9. 学习和理解C#中的事件

    注:本文系学习笔记. 上一篇文章记录了我对C#中委托的理解.委托实际上是一种类型.可以将一个或多个方法绑定到委托上面,调用委托时,一次执行委托上面绑定的方法.本文要讲述的事件实际上和委托有很深的“感情 ...

  10. HDU 2199 Can you solve this equation? (二分 水题)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...