前面一篇文章的流程太过于简单,基本没有触及到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. LR参数化设置(转)

    LR学习笔记---参数设置 2010-10-20 14:58:55|  分类: 默认分类|举报|字号 订阅     LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用 ...

  2. python学习之optparse

    Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...

  3. SystemParametersInfo

    Python的模块pywin32中的win32gui.SystemParametersInfo()函数 在使用win32con.SPI_SETDESKWALLPAPER设置Wallpaper时,其第二 ...

  4. JavaScript中值的真真假假(true and false)

    值为flase的有: false 0 "" //空串 null undefined NaN 除了以上的之外的都是ture,包括"0" (zero in quot ...

  5. 宿主进程 vshost.exe

    Hosting Process (vshost.exe) 宿主进程是VS的一个特性.可以提高调试的性能,可以进行部分信任调试(partial trust debugging),可以进行设计时表达式计算 ...

  6. 【HBase学习】Apache HBase 参考手册 中文版

    正在撰写,稍后来访……

  7. JSP学习笔记2

    <JAVA遇见HTML——JSP篇>学习笔记(下) 1.Javabean Javabeans就是符合某种规范的java类,使用Javabeans的好处是[解决代码的重复编写],减少代码冗余 ...

  8. 如何为可扩展系统进行Java Socket编程

    从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...

  9. 第十三章、学习 Shell Scripts 简单的 shell script 练习

    简单的 shell script 练习 简单范例 对谈式脚本:变量内容由使用者决定 [root@www scripts]# vi sh02.sh #!/bin/bash # Program: # Us ...

  10. [OC Foundation框架 - 10] NSDictionary

    通过唯一的key找到相应的value,类似于Map NSDictionary是不可变的   1.创建 void dicCreate() { //Immutable // NSDictionary *d ...