Axel源码阅读笔记(2)(转)
三.分析函数
axel.c
- axel_t *axel_new( conf_t *conf, int count, void *url );
- /**************************************************************************
- * function:Create a new axel_t structure。
- * 根据conf中的内容,为每个下载连接创建一个axel_t数据结构在这个函数中,
- * 其实已经为每个连接创建好连接,并且获取到要下载的文件信息了.
- * param:
- * conf_t *conf:存储axel的配置信息,axel会尝试从本地配置文件和
- * 环境变量中加载这些配置信息.
- * int count:可用的下载链接的个数.
- * void *url:此处传递的是可用的URL地址(不止一个).
- * return:返回根据URL地址所建立的下载对象.
- * *************************************************************************/
- int axel_open( axel_t *axel );
- /***************************************************************************
- * function:创建本地的存储文件,并且为多连接下载切割文件,初始化每个连接写文件
- * 的偏移位置.
- * param:
- * axel_t *axel:最终下载过程描述对象.
- * return:操作成功返回1,失败则返回0.
- * note:打开本地的一个文件来存储下载的数据.
- ****************************************************************************/
- void axel_start( axel_t *axel );
- /***************************************************************************
- * function:开始下载,这个函数中为每个连接创建一个线程,这个线程只用于连接ftp或者
- * http服务器,而不做数据下载,因为Axel是用主线程select做下载的.其中setup_thread
- * 函数是连接线程的函数体.
- * param:
- * axel_t *axel:最终下载过程描述对象.
- * return:无.
- * note:开始下载.
- ****************************************************************************/
- void axel_do( axel_t *axel );
- /***************************************************************************
- * function:下载主体函数
- * 在循环中进行如下操作,把新连接上的socket加入到集合中,使用select读取集合
- * 中所有连接接收到的文件数据,写入连接对应的文件中.
- * 如果有坏连接,超时的话,放弃该连接,下载失败,否则重新尝试该下载的连接建立.
- * param:
- * axel_t *axel:最终下载过程描述对象.
- * return:无.
- * note:下载过程就是一个不断重复的向服务请求的过程,这个重复的循环就在此函数实现.
- ****************************************************************************/
- void axel_close( axel_t *axel );
- /***************************************************************************
- * function:关闭该Axel中的连接,删除状态文件,释放内存.
- * param:
- * axel_t *axel:需要关闭的下载过程描述对象.
- * return:无.
- ****************************************************************************/
- double gettime();
- /***************************************************************************
- * function:返回当前距离1970年的秒数.
- * param:
- * 无.
- * return:当前距离1970年的秒数.
- ****************************************************************************/
- void save_state( axel_t *axel )
- /****************************************************************************
- * function:保存当前下载连接的状态,便于以后断点续传.
- * paran:
- * axel_t *axel:需要保存当前状态的下载过程描述对象.
- * return:无.
- *****************************************************************************/
- void *setup_thread( void *c )
- /****************************************************************************
- * function:被用于设置链接的线程函数.
- * param:
- * void *c:意味着可以传递任意类型的指针.
- * return:NULL.
- *****************************************************************************/
- static void axel_message( axel_t *axel, char *format, ... )
- /****************************************************************************
- * function:增加一条信息到axel->message中.
- * param:
- * axel_t *axel:需要保存当前状态的下载过程描述对象.
- * char *format, ...:这是一个格式化字符串.
- * 比如:printf("%s%s",str1,str2),那么"str1,str2"就是这个参数的值.
- * return:NULL.
- * note:此函数为静态全局函数.
- *****************************************************************************/
- static void axel_divide( axel_t *axel )
- /****************************************************************************
- * function:切分axel要存储的目标文件,主要是计算每个连接下载时的开始偏移,下载量.
- * param:
- * axel_t *axel:需要保存当前状态的下载过程描述对象.
- * return:无.
- * note:此函数为静态全局函数.
- *****************************************************************************/
conf.c
- int parse_interfaces( conf_t *conf, char *s );
- /***********************************************************************
- * function:从环境变量中指定的文件中读取一行后,如果是网卡信息,则解析
- * 网卡列表,并且去系统中获取网卡的地址列表.
- * param:
- * conf_t *conf:
- * char *s:
- * return:获取信息成功则返回1,否则返回0.
- ***********************************************************************/
- int conf_loadfile( conf_t *conf, char *file );
- /***********************************************************************
- * function:从环境变量指定的配置文件中加载配置信息,如连接数,
- * 代理,端口等信息.
- * param:
- * conf_t *conf:存储加载到的配置信息;
- * char *file:存储配置信息的文件。
- * return:加载成功返回1,否则返回0.
- ***********************************************************************/
- int conf_init( conf_t *conf );
- /***********************************************************************
- * function:从本地机器的环境变量中加载配置信息.
- * 给conf_t变量开辟空间,初始化一些默认值.
- * param:
- * conf_t *conf:需要初始化的配置信息变量.
- * return:conf初始化成功则返回1,否则返回0.
- ***********************************************************************/
- </pre><pre name="code" class="cpp">int conn_set( conn_t *conn, char *set_url );
- /***********************************************************************
- * function:用一个url来构造conn_t数据结构,操作包括:
- * 根据http://xxx或者ftp://xx来识别是ftp还是http协议.拷贝URL地密码和端口等。
- * param:
- * conn_t *conn:存储连接的所需的所有信息;
- * char *set:url地址.
- * return:成功返回1,失败返回0.
- ************************************************************************/
- char *conn_url( conn_t *conn );
- /***********************************************************************
- * function:根据conn的协议类型,构造一个标准的http或者Ftp的URL地址.
- * param:
- * conn_t *conn:存储连接的所需的所有信息。
- * return:构造好的url链接地址。
- ************************************************************************/
- void conn_disconnect( conn_t *conn );
- /***********************************************************************
- * function:断开连接.
- * param:
- * conn_t *conn:存储连接的所需的所有信息.
- * return:无.
- ************************************************************************/
- int conn_init( conn_t *conn );
- /***********************************************************************
- * function:打开到http服务器的连接或者打开到FTP服务器的连接并且切换到ftp的下载目录.
- * param:
- * conn_t *conn:存储连接的所需的所有信息.
- * return:成功返回1,失败返回0.
- ************************************************************************/
- int conn_setup( conn_t *conn );
- /***********************************************************************
- * function:发出文件请求,并读取返回控制信息,而不读取实际数据.
- * param:
- * conn_t *conn:存储连接的所需的所有信息.
- * return:成功返回1,失败返回0.
- ************************************************************************/
- int conn_exec( conn_t *conn );
- /***********************************************************************
- * function:执行ftp或者http请求,并且读取返回的控制信息,而不读取文件数据.
- * 如果是ftp的话,发送RETR命令并且读取返回码,如果是http的话发送http
- * request消息,只读取返回的http头数据.
- * param:
- * conn_t *conn:存储连接的所需的所有信息.
- * return:成功返回1,失败返回0.
- ************************************************************************/
- int conn_info( conn_t *conn );
- /***********************************************************************
- * function:通过连接获取要下载文件的大小和其它信息.
- * FTP的话,要测试断点续传功能.http的话,要获取头信息.
- * param:
- * conn_t *conn:存储连接的所需的所有信息.
- * return:成功返回1,失败返回0.
- ************************************************************************/
ftp.c
- int ftp_connect( ftp_t *conn, char *host, int port, \
- char *user, char *pass );
- /***********************************************************************
- * function:连接ftp服务器,发送USER和PASS数据,设置二进制传输模式,并且获取返回结果.
- * param:
- * ftp_t *conn:链接ftp所需要的信息;
- * char *host:链接ftp的主机名;
- * int port:链接ftp的端口号;
- * char *user:链接ftp的用户名,一般默认为anonymous;
- * char *pass:链接ftp的用户密码.
- * return:操作成功则返回1,否则返回1.
- ***********************************************************************/
- void ftp_disconnect( ftp_t *conn );
- /***********************************************************************
- * function:断开ftp连接.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息.
- * return:无.
- ***********************************************************************/
- int ftp_wait( ftp_t *conn );
- /***********************************************************************
- * function:每发送一个ftp命令后,都通过该函数来读取FTP的返回码.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息.
- * return:从ftp服务器返回的状态码.
- ***********************************************************************/
- int ftp_command( ftp_t *conn, char *format, ... );
- /***********************************************************************
- * function:发送FTP命令到服务器.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息;
- * char *format, ...:格式化输入的ftp命令.
- ***********************************************************************/
- int ftp_cwd( ftp_t *conn, char *cwd );
- /***********************************************************************
- * function:改变FTP操作目录.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息;
- * char *cwd:需要进入的新目录.
- * return:操作成功则返回1,否则返回1.
- ***********************************************************************/
- int ftp_data( ftp_t *conn );
- /***********************************************************************
- * function:开始数据连接,设置为PASV模式.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息.
- * return:操作成功则返回1,否则返回1.
- ***********************************************************************/
- long long int ftp_size( ftp_t *conn, char *file, int maxredir );
- /***********************************************************************
- * function:通过SIZE或者LIST命名获取文件大小.
- * param:
- * ftp_t *conn:链接ftp服务器所需要的信息.
- * return:操作成功则返回1,否则返回1.
- ***********************************************************************/
http.c
- int http_connect( http_t *conn, int proto, char *proxy, \
- char *host, int port, char *user, char *pass );
- /***********************************************************************
- * function:通过tcp socket的方式,结合参数中提供的代理,主机,端口,用户名和密码等信息,
- * 连接http服务器。
- * param:
- * http_t *conn:需要构造的链接http服务器所需要的信息结构体;
- * int proto:协议类型,本程序主要分为ftp和http;
- * char *proxy:代理服务器;
- * char *host:http服务器名称;
- * int port:链接http服务器所使用的端口号;
- * char *user:链接http服务器的用户名;
- * char *pass:链接http服务器的密码.
- * return:链接成功返回1,否则返回0.
- *************************************************************************/
- void http_disconnect( http_t *conn );
- /************************************************************************
- * function:断开http连接.
- * param:
- * http_t *conn:链接http服务器的所需的信息.
- * return:无.
- *************************************************************************/
- void http_get( http_t *conn, char *lurl );
- /***********************************************************************
- * function:在连接conn中添加对于ULR地址lurl的GET头信息,并且设置HTTP头中的range字段.
- * param:
- * http_t *conn:链接http服务器的所需的信息;
- * char *lurl:url地址(开头处无字符串"http://").
- * return:无.
- ************************************************************************/
- void http_addheader( http_t *conn, char *format, ... );
- /***********************************************************************
- * function:原子函数,向http连接中添加http头信息.
- * param:
- * http_t *conn:链接http服务器的所需的信息;
- * char *format, ...:格式化的输入格式和输入参数.
- * return:无.
- * note:最终将http的请求信息存储在其请求缓冲区conn->request中.
- * 其实本函数就是一个格式化输入函数.
- ************************************************************************/
- int http_exec( http_t *conn );
- /***********************************************************************
- * function:发送http reques消息,并且读取返回信息,但是不读取返回的文件数据.
- * param:
- * http_t *conn:链接http服务器的所需的信息.
- * return:成功则返回值为1,失败则返回0.
- ************************************************************************/
- char *http_header( http_t *conn, char *header );
- /***********************************************************************
- * function:查找conn返回到http数据中的名字为header的字段的值.
- * param:
- * http_t *conn:链接http服务器的所需的信息;
- * char *header:需要查找的字段名称.
- * return:如果成功则返回所查找字段的值;如果失败则返回NULL.
- ************************************************************************/
- long long int http_size( http_t *conn );
- /***********************************************************************
- * function:获取http下载的文件大小,通过解析 "Content-Length:"来实现.
- * param:
- * http_t *conn:链接http服务器的所需的信息;
- * return:如果成功则返回文件的大小;如果失败则返回-2.
- ************************************************************************/
- void http_encode( char *s );
- /***********************************************************************
- * function:http解密.
- * param:
- * char *s:我们时常下载文件时会看到url中有很多类似与“%20a%20file%20name”等
- * 比较奇怪的字符,这是网站出于安全考虑将文件名进行了简单的字符加密所致.
- * 所以在下载时,如果url中包含这样的字符串,则要首先调用这个函数将其转换
- * 为我们容易识别的文字.
- * return:虽然无返回值,但是参数是指针,所以解密后的结果就存放在s中.
- ************************************************************************/
- void http_decode( char *s );
- /***********************************************************************
- * function:http加密,与http_encode的功能相反.
- * param:
- * char *s:一个我们容易识别的url地址链接.
- * return:虽然无返回值,但是参数是指针,所以解密后的结果就存放在s中.
- ************************************************************************/
search.c
- int search_makelist( search_t *results, char *url );
- /***********************************************************************
- * function:首先连接文件源地址,获取文件信息,失败的话就返回.
- * 然后通过要下载的文件信息,构造一个访问www.***.com的URL地址.
- * 发送http请求到这个URL地址.
- * 然后循环中读取http返回页面中的内容,从中解析获取到的镜像文件的URL地址,
- * 存储到results数组中.
- * param:
- * search_t *results:待检测的http返回页面信息;
- * char *url:通过要下载的文件信息,构造一个访问www.***.com的URL地址.
- * return:如果成功则返回所建立的链表中节点的数目;如果失败则返回1.
- ************************************************************************/
- int search_getspeeds( search_t *results, int count );
- /***********************************************************************
- * function:已经获取到镜像文件的URL地址了,然后通过多线程方式,在每个线程中去访问
- * 每一个镜像文件,测试该站点的访问速度.访问速度是根据访问时间计算出来的,
- * 时间越大,速度越大.(这个速度越大,说明响应慢)
- * param:
- * search_t *results:获取到的镜像文件的URL地址.
- * int count:URL地址的个数.
- * return:返回所有下载链接的速度不为0的个数(也即可用的下载链接).
- ************************************************************************/
- void *search_speedtest( void *r )
- void search_sortlist( search_t *results, int count );
- /***********************************************************************
- * function:通过qsort来对N个镜像站点进行排名,按照访问速度,根据原理来分析,
- * 应该是speed值大,说明响应慢,速度小,这样去排序.
- * param:
- * search_t *results:获取到的镜像文件的URL地址.
- * int count:URL地址的个数.
- * return:无.
- ************************************************************************/
tcp.c
- int tcp_connect( char *hostname, int port, char *local_if );
- /***********************************************************************
- * fuction:连接主机hostname,绑定本地地址为local_if.
- * param:
- * char *hostname:链接的主机名;
- * int port:tcp链接的端口号;
- * char *local_if:本地IP地址.
- * return:如果成功则返回与服务器所建立的套接字序号;如果失败则返回0.
- ***********************************************************************/
- int get_if_ip( char *iface, char *ip );
- /***********************************************************************
- * function:获取iface的地址.
- * param:
- * char *iface:
- * char *ip:记录获取的本地IP地址(点分形式).
- * return:成功返回1,失败则返回0.
- ***********************************************************************/
text.c
- static void stop( int signal );
- /***********************************************************************
- * function:就是控制下载是否停止的一个信号量函数.
- * param:
- * int signal:这个就是宏SIGINT或者宏SIGTERM.这是两个系统定义的信号量.
- * return:无.
- * note:设置全局变量run的开关.
- ************************************************************************/
- static char *size_human( long long int value );
- /***********************************************************************
- * function:将一个长整型的字节数转换为容易理解的字节单数数输出.B/b/kb/mb
- * param:
- * long long int value:整型字节数.
- * return:返回转换后的容易理解的字节单位数.
- ************************************************************************/
- static char *time_human( int value );
- /***********************************************************************
- * function:将一个整型的单位为秒的时间数转换为容易理解的时间格式输出.
- * param:
- * int value:被转换的秒数.
- * return:转换后的时间格式字符串.
- ************************************************************************/
- static void print_commas( long long int bytes_done );
- /***********************************************************************
- * function:将已经下载的字节数立即输出.
- * param:
- * long long int bytes_done:本次已经下载的字节数.
- * return:无.
- ************************************************************************/
- static void print_alternate_output( axel_t *axel );
- /***********************************************************************
- * function:打印进度的方式,也就是-a开启的功能,表示以scp或者wget方式打印进度.
- * param:
- * axel_t *axel:下载对象.
- * return:无.
- ************************************************************************/
- static void print_help();
- /***********************************************************************
- * function:打印帮助.
- * param:无.
- * return:无.
- * note:就是当你在终端键入"Axel --help"时就会调用这个函数来显示一些参数的含义.
- ************************************************************************/
- static void print_version();
- /***********************************************************************
- * function:Axel输出版本信息.
- * param:无.
- * return:无.
- ************************************************************************/
- static void print_messages( axel_t *axel );
- /************************************************************************
- * function:输出Axel中的message结构中的信息.
- * param:
- * axel_t *axel:下载对象.
- * return:无.
-
*************************************************************************/