axel源码学习(0)——程序逻辑
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函数流程
老实讲,这个流程非常的不专业,非常的简陋,但是这也算是一个开头,一点一点地慢慢地深入。在之后的文章中主要从下面几个方面来分析:
- 下载的详细过程。
- 数据结构的分析。
- 相关协议的分析。
- 实现细节的分析。
- 设计思想的分析。
- 编程技巧的分析。
这是我暂时想到的几个方面,读源码最主要是要学习别人的编程思想和编程技巧,所以还是必须精读,这个过程下来我想会学到很多东西。axel源码里涉及到的很多技术我都不熟悉,但是我并不打算把这些必要都都学习一遍再来读,而是遇到难题再解决难题。另外,网上有一些别人的经验可以参考(但是不能依赖别人的分析)。源码的分析虽然可能会比较细致(因为有很多东西需要我去学习),但是有些细枝末节的东西还是略去,比如国际化(I18n)的问题等等。
axel源码学习(0)——程序逻辑的更多相关文章
- Golang源码学习:调度逻辑(二)main goroutine的创建
接上一篇继续分析一下runtime.newproc方法. 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数):fn ...
- axel源码学习(1)——重要流程细节
前面一篇文章的流程太过于简单,基本没有触及到axel的核心,因此本文将要把axel中的几个重要的主要的操作流程单独弄出来看看,还是按照main函数的执行顺序来展开,略去错误处理之类的流程仅仅着眼于最重 ...
- ABP框架源码学习之授权逻辑
asp.net core的默认的几种授权方法参考"雨夜朦胧"的系列博客,这里要强调的是asp.net core mvc中的授权和asp.net mvc中的授权不一样,建议先看前面& ...
- Golang源码学习:调度逻辑(一)初始化
本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...
- Golang源码学习:调度逻辑(四)系统调用
Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...
- Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环
本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...
- Spring5.0源码学习系列之Spring AOP简述
前言介绍 附录:Spring源码学习专栏 在前面章节的学习中,我们对Spring框架的IOC实现源码有了一定的了解,接着本文继续学习Springframework一个核心的技术点AOP技术. 在学习S ...
- Spring5.0源码学习系列之事务管理概述
Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...
- 【Spark2.0源码学习】-1.概述
Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...
随机推荐
- windows和linux间互传文件
方法1:Xshell传输文件 用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安 ...
- HDU 3586-Information Disturbing(树形dp)
题意: n个节点的通信连接树,切断每个边有一定的花费,要你切断边,在总花费不超过m的前提,使所有的其他节点都不能和节点1(根)连通,切边时有花费上限,让你最小化这个上限. 分析:最小化最大值,想到二分 ...
- Linux新手必看:浅谈如何学习linux
本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix问题1:版本的选择 北美用redhat,欧洲用SuSE, ...
- VS2013 :IntelliSense: 不允许使用不完整的类型
出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...
- VIP网络水军账号
作为一个技术部的组长,主管公司用户相关的项目.今天一名营销同事找我说他想长生3000个水军账号,我首先就想到了以下几个问题: 1.如何实现 2.产生水军对运营项目的影响,主要问题就是一个真实性问题. ...
- algorithm@ lower_bound implementation(Binary Search)
一道来自jhu algorithm的作业题: Given two sorted arrays A, B, give a linear time algorithm that finds two entr ...
- hdu5785--Interesting(manacher)
题意:求给定字符串的三元组(I,J,K) 使得S[i..j] 和 S[j+1..k] 都是回文串.求所有满足条件的三元组 ∑(i*k) 题解:求出以j为结尾的回文串起始位置的和记为lv[j],和以j ...
- Java 反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- 现代程序设计homework-02
总体思路 (1)单维数组 单维数组的思路的构建在第一次作业已经完成了,简单来说就是根据贪心策略从头到尾累加,一旦遇到当前累加和变为负数,就将累加和清零,继续遍历数组中的元素,算法的时间复杂度是O(n) ...
- DNS服务未响应的简单解决办法
今天晚上下班回家,打开电脑,发现打不开网页了,同一个wifi环境下,我的手机是可以连接上的,网上搜了一大推,又是重启服务,又是重新填写dns服务地址,都不管用, 该怎么办呢??. 其实发现很简单,打开 ...