axel简介

axel是一个命令行下的轻量级http/ftp 下载加速工具,支持多线程下载和断点续传,支持从多个镜像下载同一文件。

axel的用法如下:

图 0.1 axel usage

axel 粗读

一、源码阅读准备

首先需要了解axel的用法,实际上参数选项比较少,简单看一下就能明白。在阅读源码的时候有时候需要回过头看一看选项的作用,使得代码更加容易看懂。另外,我建议可以修改一下configure文件的debug选项,这样编译完成之后可以使用gdb进行调试追踪,而且从代码上可以看出,debug版本的axel在使用的时候会输出更多更加详细的信息,这些信息在我们搞清楚流程上有比较大的帮助。

 

二、理清文件组成

axel 是一个非常轻量级的下载工具,代码量比较少,文件组成也相对简单。

 

axel.h  axel.c axel结构体定义和操作,下载的主体部分在这里面实现
conf.h  conf.h 故名思议,这是有关配置的文件,至于配置的细节留待以后分析
conn.h  conn.h 这也很显然是connection相关
ftp.h  ftp.c ftp协议相关的实现
http.h http.c http协议相关实现
search.h search.c 这里的search是指的搜索镜像网站,由选项-S控制(如图 0.1)
tcp.c  tcp.h TCP控制相关实现
text.c 下载状态显示相关实现。注意:程序的main函数也在这个文件中!!

 

三、简单流程

理清了文件的组成之后,有的放矢,打开text.c来看看程序的主体流程是怎样的,目前不分析细节,只从main函数中梳理出大致的流程,细节留到后续详细分析。

画了一个流程图:

 

图 0.2 axel main函数流程

老实讲,这个流程非常的不专业,非常的简陋,但是这也算是一个开头,一点一点地慢慢地深入。在之后的文章中主要从下面几个方面来分析:

  1. 下载的详细过程。
  2. 数据结构的分析。
  3. 相关协议的分析。
  4. 实现细节的分析。
  5. 设计思想的分析。
  6. 编程技巧的分析。

这是我暂时想到的几个方面,读源码最主要是要学习别人的编程思想和编程技巧,所以还是必须精读,这个过程下来我想会学到很多东西。axel源码里涉及到的很多技术我都不熟悉,但是我并不打算把这些必要都都学习一遍再来读,而是遇到难题再解决难题。另外,网上有一些别人的经验可以参考(但是不能依赖别人的分析)。源码的分析虽然可能会比较细致(因为有很多东西需要我去学习),但是有些细枝末节的东西还是略去,比如国际化(I18n)的问题等等。

axel源码学习(0)——程序逻辑的更多相关文章

  1. Golang源码学习:调度逻辑(二)main goroutine的创建

    接上一篇继续分析一下runtime.newproc方法. 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数):fn ...

  2. axel源码学习(1)——重要流程细节

    前面一篇文章的流程太过于简单,基本没有触及到axel的核心,因此本文将要把axel中的几个重要的主要的操作流程单独弄出来看看,还是按照main函数的执行顺序来展开,略去错误处理之类的流程仅仅着眼于最重 ...

  3. ABP框架源码学习之授权逻辑

    asp.net core的默认的几种授权方法参考"雨夜朦胧"的系列博客,这里要强调的是asp.net core mvc中的授权和asp.net mvc中的授权不一样,建议先看前面& ...

  4. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...

  5. Golang源码学习:调度逻辑(四)系统调用

    Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...

  6. Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环

    本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...

  7. Spring5.0源码学习系列之Spring AOP简述

    前言介绍 附录:Spring源码学习专栏 在前面章节的学习中,我们对Spring框架的IOC实现源码有了一定的了解,接着本文继续学习Springframework一个核心的技术点AOP技术. 在学习S ...

  8. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  9. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

随机推荐

  1. e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector

    Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...

  2. NOIP2008 双栈队列

    1.      双栈排序 (twostack.pas/c/cpp) Tom 最近在研究一个有趣的排序问题.如图所示,通过 2 个栈 S1 和 S2,Tom 希望借助 以下 4 种操作实现将输入序列升序 ...

  3. 【bzoj1300】大数计算器

    题意: 求C(n,m) 如果C(n,m)的位数<=12 那么直接输出 否则按XXX...XXXXXXXXX的形式输出 题解: 这题之前打过 但是昨天又想出一种新的做法 先说下新的做法吧- - _ ...

  4. hdu5785--Interesting(manacher)

    题意:求给定字符串的三元组(I,J,K)  使得S[i..j] 和 S[j+1..k] 都是回文串.求所有满足条件的三元组 ∑(i*k) 题解:求出以j为结尾的回文串起始位置的和记为lv[j],和以j ...

  5. nyoj 60 谁获得了最高奖学金

    谁获得了最高奖学金 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述     某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: ...

  6. SQL Server中取两个表的交集,并集和差集

    在项目中遇到要取两个表差集的情况 假设有两个表tblNZPostCodes, NZPostcode  两个表中存储的都是新西兰的post code信息,字段一致,只是数据上有所差异. 1. Union ...

  7. S2SH项目框架搭建(完全注解)

    1.引入相关jar包 2.配置Spring配置文件,命名为applicationContext.xml(配置好后放到src目录下) <beans xmlns="http://www.s ...

  8. 第一个android程序所遇到问题

    1.工程package的命名空间与activity的命名空间不一致,导致setcontentview找不到layout文件 2.增加Button等控件后,Java.R中id必须在删除现有Java.R文 ...

  9. hibernate学习五(关系映射多对一与一对多)

    一.多对一 多对一(或者一对多):在学生与老师的情况下,一个老师可以教多个学生,但一个学生只能被教一个老师教: 对于类:在多的那方拥有一的那方的一个实体 二.修改student.java和teache ...

  10. 剑指OFFER之第一个只出现一次的字符(九度OJ1283)

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...