Axel源码阅读笔记<二>

三.分析函数

axel.c

  1. axel_t *axel_new( conf_t *conf, int count, void *url );  
  2. /************************************************************************** 
  3.  * function:Create a new axel_t structure。 
  4.  *      根据conf中的内容,为每个下载连接创建一个axel_t数据结构在这个函数中, 
  5.  *      其实已经为每个连接创建好连接,并且获取到要下载的文件信息了. 
  6.  * param: 
  7.  *  conf_t *conf:存储axel的配置信息,axel会尝试从本地配置文件和 
  8.  *      环境变量中加载这些配置信息. 
  9.  *  int count:可用的下载链接的个数. 
  10.  *  void *url:此处传递的是可用的URL地址(不止一个). 
  11.  * return:返回根据URL地址所建立的下载对象. 
  12.  * *************************************************************************/  
  13. int axel_open( axel_t *axel );  
  14. /*************************************************************************** 
  15. * function:创建本地的存储文件,并且为多连接下载切割文件,初始化每个连接写文件 
  16. *       的偏移位置. 
  17. * param: 
  18. *   axel_t *axel:最终下载过程描述对象. 
  19. * return:操作成功返回1,失败则返回0. 
  20. * note:打开本地的一个文件来存储下载的数据. 
  21. ****************************************************************************/  
  22. void axel_start( axel_t *axel );  
  23. /*************************************************************************** 
  24. * function:开始下载,这个函数中为每个连接创建一个线程,这个线程只用于连接ftp或者 
  25. *   http服务器,而不做数据下载,因为Axel是用主线程select做下载的.其中setup_thread 
  26. *   函数是连接线程的函数体. 
  27. * param: 
  28. *   axel_t *axel:最终下载过程描述对象. 
  29. * return:无. 
  30. * note:开始下载. 
  31. ****************************************************************************/  
  32. void axel_do( axel_t *axel );  
  33. /*************************************************************************** 
  34. * function:下载主体函数 
  35. *   在循环中进行如下操作,把新连接上的socket加入到集合中,使用select读取集合 
  36. *   中所有连接接收到的文件数据,写入连接对应的文件中. 
  37. *   如果有坏连接,超时的话,放弃该连接,下载失败,否则重新尝试该下载的连接建立. 
  38. * param: 
  39. *   axel_t *axel:最终下载过程描述对象. 
  40. * return:无. 
  41. * note:下载过程就是一个不断重复的向服务请求的过程,这个重复的循环就在此函数实现. 
  42. ****************************************************************************/  
  43. void axel_close( axel_t *axel );  
  44. /*************************************************************************** 
  45. * function:关闭该Axel中的连接,删除状态文件,释放内存. 
  46. * param: 
  47. *       axel_t *axel:需要关闭的下载过程描述对象. 
  48. * return:无. 
  49. ****************************************************************************/  
  50. double gettime();  
  51. /*************************************************************************** 
  52. * function:返回当前距离1970年的秒数. 
  53. * param: 
  54. *   无. 
  55. * return:当前距离1970年的秒数. 
  56. ****************************************************************************/  
  57. void save_state( axel_t *axel )  
  58. /**************************************************************************** 
  59. * function:保存当前下载连接的状态,便于以后断点续传. 
  60. * paran: 
  61. *   axel_t *axel:需要保存当前状态的下载过程描述对象. 
  62. * return:无. 
  63. *****************************************************************************/  
  64. void *setup_thread( void *c )  
  65. /**************************************************************************** 
  66. * function:被用于设置链接的线程函数. 
  67. * param: 
  68. *       void *c:意味着可以传递任意类型的指针. 
  69. * return:NULL. 
  70. *****************************************************************************/  
  71. static void axel_message( axel_t *axel, char *format, ... )  
  72. /**************************************************************************** 
  73. * function:增加一条信息到axel->message中. 
  74. * param: 
  75. *   axel_t *axel:需要保存当前状态的下载过程描述对象. 
  76. *   char *format, ...:这是一个格式化字符串. 
  77. *       比如:printf("%s%s",str1,str2),那么"str1,str2"就是这个参数的值. 
  78. * return:NULL. 
  79. * note:此函数为静态全局函数. 
  80. *****************************************************************************/  
  81. static void axel_divide( axel_t *axel )  
  82. /**************************************************************************** 
  83. * function:切分axel要存储的目标文件,主要是计算每个连接下载时的开始偏移,下载量. 
  84. * param: 
  85. *   axel_t *axel:需要保存当前状态的下载过程描述对象. 
  86. * return:无. 
  87. * note:此函数为静态全局函数. 
  88. *****************************************************************************/  

conf.c

  1. int parse_interfaces( conf_t *conf, char *s );  
  2. /*********************************************************************** 
  3.  * function:从环境变量中指定的文件中读取一行后,如果是网卡信息,则解析 
  4.  *          网卡列表,并且去系统中获取网卡的地址列表. 
  5.  * param: 
  6.  *      conf_t *conf: 
  7.  *      char *s: 
  8.  * return:获取信息成功则返回1,否则返回0. 
  9.  ***********************************************************************/  
  10. int conf_loadfile( conf_t *conf, char *file );  
  11. /*********************************************************************** 
  12.  * function:从环境变量指定的配置文件中加载配置信息,如连接数, 
  13.  *          代理,端口等信息. 
  14.  * param: 
  15.  *      conf_t *conf:存储加载到的配置信息; 
  16.  *      char *file:存储配置信息的文件。 
  17.  * return:加载成功返回1,否则返回0. 
  18.  ***********************************************************************/  
  19. int conf_init( conf_t *conf );  
  20. /*********************************************************************** 
  21.  * function:从本地机器的环境变量中加载配置信息. 
  22.  *          给conf_t变量开辟空间,初始化一些默认值. 
  23.  * param: 
  24.  *      conf_t *conf:需要初始化的配置信息变量. 
  25.  * return:conf初始化成功则返回1,否则返回0. 
  26.  ***********************************************************************/  
  1. </pre><pre name="code" class="cpp">int conn_set( conn_t *conn, char *set_url );  
  1. /***********************************************************************  
  2. * function:用一个url来构造conn_t数据结构,操作包括:  
  3. *       根据http://xxx或者ftp://xx来识别是ftp还是http协议.拷贝URL地密码和端口等。  
  1. * param:  
  2. *       conn_t *conn:存储连接的所需的所有信息;  
  3. *       char *set:url地址.  
  4. return:成功返回1,失败返回0.  
  5. ************************************************************************/  
  6. char *conn_url( conn_t *conn );  
  7. /*********************************************************************** 
  8. * function:根据conn的协议类型,构造一个标准的http或者Ftp的URL地址. 
  9. * param: 
  10. *       conn_t *conn:存储连接的所需的所有信息。 
  11. * return:构造好的url链接地址。 
  12. ************************************************************************/  
  13. void conn_disconnect( conn_t *conn );  
  14. /*********************************************************************** 
  15. * function:断开连接. 
  16. * param: 
  17. *   conn_t *conn:存储连接的所需的所有信息. 
  18. * return:无. 
  19. ************************************************************************/  
  20. int conn_init( conn_t *conn );  
  21. /*********************************************************************** 
  22. * function:打开到http服务器的连接或者打开到FTP服务器的连接并且切换到ftp的下载目录. 
  23. * param: 
  24. *       conn_t *conn:存储连接的所需的所有信息. 
  25. * return:成功返回1,失败返回0. 
  26. ************************************************************************/  
  27. int conn_setup( conn_t *conn );  
  28. /*********************************************************************** 
  29. * function:发出文件请求,并读取返回控制信息,而不读取实际数据. 
  30. * param: 
  31. *   conn_t *conn:存储连接的所需的所有信息. 
  32. * return:成功返回1,失败返回0. 
  33. ************************************************************************/  
  34. int conn_exec( conn_t *conn );  
  35. /***********************************************************************  
  36. * function:执行ftp或者http请求,并且读取返回的控制信息,而不读取文件数据.  
  37. *       如果是ftp的话,发送RETR命令并且读取返回码,如果是http的话发送http   
  1. *               request消息,只读取返回的http头数据.  
  2. * param:  
  3. *   conn_t *conn:存储连接的所需的所有信息.  
  4. return:成功返回1,失败返回0.  
  5. ************************************************************************/  
  6. int conn_info( conn_t *conn );  
  7. /*********************************************************************** 
  8. * function:通过连接获取要下载文件的大小和其它信息. 
  9. *       FTP的话,要测试断点续传功能.http的话,要获取头信息.  
  10. * param: 
  11. *       conn_t *conn:存储连接的所需的所有信息. 
  12. * return:成功返回1,失败返回0. 
  13. ************************************************************************/  

ftp.c

  1. int ftp_connect( ftp_t *conn, char *host, int port, \  
  1.                char *user, char *pass );  
  2. /*********************************************************************** 
  3.  * function:连接ftp服务器,发送USER和PASS数据,设置二进制传输模式,并且获取返回结果. 
  4.  * param: 
  5.  *      ftp_t *conn:链接ftp所需要的信息; 
  6.  *      char *host:链接ftp的主机名; 
  7.  *      int port:链接ftp的端口号; 
  8.  *      char *user:链接ftp的用户名,一般默认为anonymous; 
  9.  *      char *pass:链接ftp的用户密码. 
  10.  * return:操作成功则返回1,否则返回1. 
  11.  ***********************************************************************/  
  12. void ftp_disconnect( ftp_t *conn );  
  13. /*********************************************************************** 
  14.  * function:断开ftp连接. 
  15.  * param: 
  16.  *      ftp_t *conn:链接ftp服务器所需要的信息. 
  17.  * return:无. 
  18.  ***********************************************************************/  
  19. int ftp_wait( ftp_t *conn );  
  20. /*********************************************************************** 
  21.  * function:每发送一个ftp命令后,都通过该函数来读取FTP的返回码. 
  22.  * param: 
  23.  *      ftp_t *conn:链接ftp服务器所需要的信息. 
  24.  * return:从ftp服务器返回的状态码. 
  25.  ***********************************************************************/  
  26. int ftp_command( ftp_t *conn, char *format, ... );  
  27. /*********************************************************************** 
  28.  * function:发送FTP命令到服务器. 
  29.  * param: 
  30.  *      ftp_t *conn:链接ftp服务器所需要的信息; 
  31.  *      char *format, ...:格式化输入的ftp命令. 
  32.  ***********************************************************************/  
  33. int ftp_cwd( ftp_t *conn, char *cwd );  
  34. /*********************************************************************** 
  35.  * function:改变FTP操作目录. 
  36.  * param: 
  37.  *      ftp_t *conn:链接ftp服务器所需要的信息; 
  38.  *      char *cwd:需要进入的新目录. 
  39.  * return:操作成功则返回1,否则返回1. 
  40.  ***********************************************************************/  
  41. int ftp_data( ftp_t *conn );  
  42. /*********************************************************************** 
  43.  * function:开始数据连接,设置为PASV模式. 
  44.  * param: 
  45.  *      ftp_t *conn:链接ftp服务器所需要的信息. 
  46.  * return:操作成功则返回1,否则返回1. 
  47.  ***********************************************************************/  
  48. long long int ftp_size( ftp_t *conn, char *file, int maxredir );  
  49. /*********************************************************************** 
  50.  * function:通过SIZE或者LIST命名获取文件大小. 
  51.  * param: 
  52.  *      ftp_t *conn:链接ftp服务器所需要的信息. 
  53.  * return:操作成功则返回1,否则返回1. 
  54.  ***********************************************************************/  

http.c

  1. int http_connect( http_t *conn, int proto, char *proxy, \  
  2.     char *host, int port, char *user, char *pass );  
  3. /*********************************************************************** 
  4. * function:通过tcp socket的方式,结合参数中提供的代理,主机,端口,用户名和密码等信息, 
  5. *           连接http服务器。 
  6. * param: 
  7. *   http_t *conn:需要构造的链接http服务器所需要的信息结构体; 
  8. *   int proto:协议类型,本程序主要分为ftp和http; 
  9. *   char *proxy:代理服务器; 
  10. *   char *host:http服务器名称; 
  11. *   int port:链接http服务器所使用的端口号; 
  12. *   char *user:链接http服务器的用户名; 
  13. *   char *pass:链接http服务器的密码. 
  14. * return:链接成功返回1,否则返回0. 
  15. *************************************************************************/  
  16. void http_disconnect( http_t *conn );  
  17. /************************************************************************ 
  18. * function:断开http连接. 
  19. * param: 
  20. *   http_t *conn:链接http服务器的所需的信息. 
  21. * return:无. 
  22. *************************************************************************/  
  23. void http_get( http_t *conn, char *lurl );  
  24. /*********************************************************************** 
  25. * function:在连接conn中添加对于ULR地址lurl的GET头信息,并且设置HTTP头中的range字段. 
  26. * param: 
  27. *   http_t *conn:链接http服务器的所需的信息; 
  28. *   char *lurl:url地址(开头处无字符串"http://"). 
  29. * return:无. 
  30. ************************************************************************/  
  31. void http_addheader( http_t *conn, char *format, ... );  
  32. /*********************************************************************** 
  33. * function:原子函数,向http连接中添加http头信息. 
  34. * param: 
  35. *   http_t *conn:链接http服务器的所需的信息; 
  36. *   char *format, ...:格式化的输入格式和输入参数. 
  37. * return:无. 
  38. * note:最终将http的请求信息存储在其请求缓冲区conn->request中. 
  39. *   其实本函数就是一个格式化输入函数. 
  40. ************************************************************************/  
  41. int http_exec( http_t *conn );  
  42. /*********************************************************************** 
  43. * function:发送http reques消息,并且读取返回信息,但是不读取返回的文件数据. 
  44. * param: 
  45. *   http_t *conn:链接http服务器的所需的信息. 
  46. * return:成功则返回值为1,失败则返回0. 
  47. ************************************************************************/  
  48. char *http_header( http_t *conn, char *header );  
  49. /*********************************************************************** 
  50. * function:查找conn返回到http数据中的名字为header的字段的值. 
  51. * param: 
  52. *   http_t *conn:链接http服务器的所需的信息; 
  53. *   char *header:需要查找的字段名称. 
  54. * return:如果成功则返回所查找字段的值;如果失败则返回NULL. 
  55. ************************************************************************/  
  56. long long int http_size( http_t *conn );  
  57. /*********************************************************************** 
  58. * function:获取http下载的文件大小,通过解析 "Content-Length:"来实现. 
  59. * param: 
  60. *   http_t *conn:链接http服务器的所需的信息; 
  61. * return:如果成功则返回文件的大小;如果失败则返回-2. 
  62. ************************************************************************/  
  63. void http_encode( char *s );  
  64. /*********************************************************************** 
  65. * function:http解密. 
  66. * param: 
  67. *   char *s:我们时常下载文件时会看到url中有很多类似与“%20a%20file%20name”等 
  68. *       比较奇怪的字符,这是网站出于安全考虑将文件名进行了简单的字符加密所致. 
  69. *       所以在下载时,如果url中包含这样的字符串,则要首先调用这个函数将其转换 
  70. *       为我们容易识别的文字. 
  71. * return:虽然无返回值,但是参数是指针,所以解密后的结果就存放在s中. 
  72. ************************************************************************/  
  73. void http_decode( char *s );  
  74. /*********************************************************************** 
  75. * function:http加密,与http_encode的功能相反. 
  76. * param: 
  77. *   char *s:一个我们容易识别的url地址链接. 
  78. * return:虽然无返回值,但是参数是指针,所以解密后的结果就存放在s中. 
  79. ************************************************************************/  

search.c

  1. int search_makelist( search_t *results, char *url );  
  2. /*********************************************************************** 
  3. * function:首先连接文件源地址,获取文件信息,失败的话就返回. 
  4. *   然后通过要下载的文件信息,构造一个访问www.***.com的URL地址. 
  5. *   发送http请求到这个URL地址. 
  6. *   然后循环中读取http返回页面中的内容,从中解析获取到的镜像文件的URL地址, 
  7. *   存储到results数组中. 
  8. * param: 
  9. *   search_t *results:待检测的http返回页面信息; 
  10. *   char *url:通过要下载的文件信息,构造一个访问www.***.com的URL地址. 
  11. * return:如果成功则返回所建立的链表中节点的数目;如果失败则返回1. 
  12. ************************************************************************/  
  13. int search_getspeeds( search_t *results, int count );  
  14. /*********************************************************************** 
  15. * function:已经获取到镜像文件的URL地址了,然后通过多线程方式,在每个线程中去访问 
  16. *       每一个镜像文件,测试该站点的访问速度.访问速度是根据访问时间计算出来的, 
  17. *       时间越大,速度越大.(这个速度越大,说明响应慢) 
  18. * param: 
  19. *       search_t *results:获取到的镜像文件的URL地址. 
  20. *       int count:URL地址的个数. 
  21. * return:返回所有下载链接的速度不为0的个数(也即可用的下载链接). 
  22. ************************************************************************/  
  23. void *search_speedtest( void *r )  
  24.   
  25. void search_sortlist( search_t *results, int count );  
  26. /*********************************************************************** 
  27. * function:通过qsort来对N个镜像站点进行排名,按照访问速度,根据原理来分析, 
  28. *       应该是speed值大,说明响应慢,速度小,这样去排序. 
  29. * param: 
  30. *       search_t *results:获取到的镜像文件的URL地址. 
  31. *       int count:URL地址的个数. 
  32. * return:无. 
  33. ************************************************************************/  

tcp.c

  1. int tcp_connect( char *hostname, int port, char *local_if );  
  2. /*********************************************************************** 
  3.  * fuction:连接主机hostname,绑定本地地址为local_if. 
  4.  * param: 
  5.  *      char *hostname:链接的主机名; 
  6.  *      int port:tcp链接的端口号; 
  7.  *      char *local_if:本地IP地址. 
  8.  * return:如果成功则返回与服务器所建立的套接字序号;如果失败则返回0. 
  9.  ***********************************************************************/  
  10. int get_if_ip( char *iface, char *ip );  
  11. /*********************************************************************** 
  12.  * function:获取iface的地址. 
  13.  * param: 
  14.  *      char *iface: 
  15.  *      char *ip:记录获取的本地IP地址(点分形式). 
  16.  * return:成功返回1,失败则返回0.  
  17.  ***********************************************************************/  

text.c

  1. static void stop( int signal );  
  2. /*********************************************************************** 
  3. * function:就是控制下载是否停止的一个信号量函数. 
  4. * param: 
  5. *   int signal:这个就是宏SIGINT或者宏SIGTERM.这是两个系统定义的信号量. 
  6. * return:无. 
  7. * note:设置全局变量run的开关. 
  8. ************************************************************************/  
  9. static char *size_human( long long int value );  
  10. /*********************************************************************** 
  11. * function:将一个长整型的字节数转换为容易理解的字节单数数输出.B/b/kb/mb 
  12. * param: 
  13. *   long long int value:整型字节数. 
  14. * return:返回转换后的容易理解的字节单位数. 
  15. ************************************************************************/  
  16. static char *time_human( int value );  
  17. /*********************************************************************** 
  18. * function:将一个整型的单位为秒的时间数转换为容易理解的时间格式输出. 
  19. * param: 
  20. *   int value:被转换的秒数. 
  21. * return:转换后的时间格式字符串. 
  22. ************************************************************************/  
  23. static void print_commas( long long int bytes_done );  
  24. /*********************************************************************** 
  25. * function:将已经下载的字节数立即输出. 
  26. * param: 
  27. *   long long int bytes_done:本次已经下载的字节数. 
  28. * return:无. 
  29. ************************************************************************/  
  30. static void print_alternate_output( axel_t *axel );  
  31. /*********************************************************************** 
  32. * function:打印进度的方式,也就是-a开启的功能,表示以scp或者wget方式打印进度. 
  33. * param: 
  34. *   axel_t *axel:下载对象. 
  35. * return:无. 
  36. ************************************************************************/  
  37. static void print_help();  
  38. /*********************************************************************** 
  39. * function:打印帮助. 
  40. * param:无. 
  41. * return:无. 
  42. * note:就是当你在终端键入"Axel --help"时就会调用这个函数来显示一些参数的含义. 
  43. ************************************************************************/  
  44. static void print_version();  
  45. /*********************************************************************** 
  46. * function:Axel输出版本信息. 
  47. * param:无. 
  48. * return:无. 
  49. ************************************************************************/  
  50. static void print_messages( axel_t *axel );  
  51. /************************************************************************ 
  52. * function:输出Axel中的message结构中的信息. 
  53. * param: 
  54. *   axel_t *axel:下载对象. 
  55. * return:无. 
  56. *************************************************************************/  
(后续还有相关笔记,请大家一起探讨)
注解:期待有共同编程爱好的博友,批评指正,一起交流,共同学习.我的邮箱:opensourceroad@gmail.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Axel是一个开源的多线程下载工具,适用于Linux和Windows操作系统。对于Windows版本的Axel,可以直接从其官方网站或源代码库进行下载和安装。 在Windows上使用Axel,首先需要下载对应的可执行文件并进行安装。下载完成后,用户可以通过命令行在Windows命令提示符界面中运行Axel。 使用Axel下载文件时,用户需要指定下载链接和保存路径。通过设置参数,用户可以控制下载的线程数量、速度限制等。Axel还提供了一些其他功能,如断点续传和自动重试等,以提高下载效率和稳定性。 使用Axel的好处是可以充分利用多线程技术,加快文件下载速度。特别是当用户需要下载大文件或网络连接不稳定时,Axel可以优化下载过程,避免出现下载中断或下载速度过慢的情况。 总而言之,Axel是一个高效的Windows下载工具,可以在命令行环境下运行,并支持多线程下载。用户通过设置参数来控制下载行为,并可以利用其提供的特性来提高下载效率和稳定性。 ### 回答2: Axel是一个用于加速文件下载的开源命令行工具,可以在Windows操作系统上使用。该工具允许用户同时下载多个文件,并且可以将一个大文件分割成多个部分并同时下载,以提高下载速度。以下是关于Axel在Windows版本上的一些特点: 1. 易于安装和使用:Axel的Windows版本可通过官方网站或其他第三方网站下载并安装。安装完成后,用户可以通过命令行界面运行Axel。 2. 命令行界面:Axel的Windows版本仅提供命令行界面,用户可以使用不同的命令参数来定制下载过程,如指定下载的线程数、最大连接数、下载速度限制等。 3. 多线程下载:Axel使用多线程技术,可以同时下载多个文件段或多个文件,从而提高下载速度。用户可以在下载命令中指定线程数来控制下载的并发数量。 4. 断点续传:Axel的Windows版本支持断点续传功能,当网络中断或下载中途出现故障时,可以通过重新启动Axel来继续下载,而无需重新下载整个文件。 5. 高速下载:由于Axel使用多线程和分段下载技术,可以有效提高下载速度,将文件下载时间缩短。 总之,Axel的Windows版本是一个强大且易于使用的下载工具,可以帮助用户提高文件下载速度,并支持断点续传功能。无论是单个大文件还是多个文件,Axel都能够通过多线程技术同时下载,使得下载过程更加快速高效。 ### 回答3: Axel是一个多线程下载工具,它可以在Windows操作系统上使用。Axel是一个命令行工具,它允许用户以更快的速度下载文件。该工具使用多个线程分割文件,并通过同时下载和组合这些分块来加快下载速度。通过使用多个连接和线程,Axel可以提供更高的下载速度。 在Windows上安装和使用Axel非常简单。首先,需要下载Axel的Windows版本,并将其保存到计算机上的特定目录中。然后,需要在命令提示符窗口中运行Axel并指定要下载的文件的URL。用户还可以使用命令行选项来指定下载速度限制、用户代理和输出文件名等参数。 Axel的Windows版本还提供了许多其他功能,如断点续传、重新连接和多线程下载等。断点续传功能允许用户在下载过程中暂停并在以后恢复下载,无需重新开始整个过程。重新连接功能确保在连接断开后能够重新建立连接并继续下载。多线程下载允许Axel同时使用多个线程来加快下载速度。 总之,Axel的Windows版本是一个功能强大且易于使用的多线程下载工具。它可以在Windows操作系统上实现更快的下载速度,并提供其他高级功能,如断点续传和重新连接。无论是下载大文件还是需要更快下载速度的用户,Axel都是一个不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值