免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanjigang

源码阅读第一期:axel和wget [复制链接]

论坛徽章:
0
发表于 2011-09-26 16:03 |显示全部楼层
强烈支持!!!

论坛徽章:
0
发表于 2011-09-26 16:14 |显示全部楼层
这个活动太好了!绝对要支持~ 

论坛徽章:
0
发表于 2011-09-26 16:59 |显示全部楼层
支持。

论坛徽章:
0
发表于 2011-09-26 17:46 |显示全部楼层
本帖最后由 c04n05 于 2011-09-26 17:49 编辑

刚刚稍微看了一下axel的配置文件解析。
推荐一篇好文:
http://lyxint.com/archives/46
PS:楼上的弟兄们也不要光灌水啊。

论坛徽章:
0
发表于 2011-09-26 21:47 |显示全部楼层
不错~抱着学习的态度来的。

论坛徽章:
0
发表于 2011-09-26 23:54 |显示全部楼层
来支持个
最近看些shell

论坛徽章:
0
发表于 2011-09-27 10:44 |显示全部楼层
刚刚稍微看了一下axel的配置文件解析。
推荐一篇好文:

PS:楼上的弟兄们也不要光灌水啊。
c04n05 发表于 2011-09-26 17:46



    这个不错,我也准备在代码分析完后把加上注解的代码放到git,这样都能看到,也能给出意见:wink:

论坛徽章:
0
发表于 2011-09-27 10:46 |显示全部楼层
本帖最后由 duanjigang 于 2011-09-27 10:49 编辑

到今天基本上把所有的主题函数和流程搞清楚了,先把所有的文件列表和功能贴一下,回头再分析数据结构程序的核心算法。赫赫。

axel就很少几个文件:

  1. ls *.h *.c
  2. axel.c  conf.c  config.h  conn.h  ftp.h   http.h    search.h  tcp.h
  3. axel.h  conf.h  conn.c    ftp.c   http.c  search.c  tcp.c     text.c
复制代码
下面,结合每组文件的功能,对其中的函数进行说明。这样方便对代码的整体进行框架性的了解


axel.h
axel.c


axel中把每个用于下载的连接抽象为一个axel_t的结构体,因此下载的所有操作
都是围绕这个数据结构展开的。

  1. axel_t *axel_new( conf_t *conf, int count, void *url )
复制代码
根据conf中的内容,为每个下载连接创建一个axel_t数据结构
在这个函数中,其实已经为每个连接创建好连接,并且获取到
要下载的文件信息了。

  1. int axel_open( axel_t *axel )
复制代码
创建本地的存储文件,并且为多连接下载切割文件,初始化每个连接写文件
的偏移位置

  1. void axel_start( axel_t *axel )
复制代码
开始下载,这个函数中为每个连接创建一个线程,这个线程只用于连接ftp或者http
服务器,而不做数据下载,因为Axel是用主线程select做下载的。其中
setup_thread 函数是连接线程的函数体.

  1. void axel_do( axel_t *axel )
复制代码
下载主体函数:

在循环中进行如下操作,把新连接上的socket加入到集合中,使用select读取集合中所有连接
接收到的文件数据,写入连接对应的文件中。
如果有坏连接,超时的话,放弃该连接,下载失败,否则重新尝试该下载的连接建立。

  1. void axel_close( axel_t *axel )
复制代码
关闭该Axel中的连接,删除状态文件,释放内存

  1. static void axel_divide( axel_t *axel )
复制代码
切分axel要存储的目标文件,主要是计算每个连接下载时的开始偏移,下载量

论坛徽章:
0
发表于 2011-09-27 10:52 |显示全部楼层
conf.h
conf.c


根据文件名称能知道这两个文件是用于配置操作的

conf.h中有一个大大的结构体conf_t就是用于存储axel的全局配置的。

看一下conf.c中的主要函数

  1. int conf_init( conf_t *conf )
复制代码
从本地机器的环境变量中加载配置信息


  1. int conf_loadfile( conf_t *conf, char *file )
复制代码
从环境变量指定的配置文件中加载配置信息,如连接数,代理,端口等信息。


  1. int parse_interfaces( conf_t *conf, char *s )
复制代码
从环境变量中指定的文件中读取一行后,如果是网卡信息,则解析网卡列表,并且去系统中获取网卡的地址列表。

====================
conn.h
conn.c


顾名思义,这两个文件主要实现用于网络连接的相关操作

conn_t 定义了一个连接的所有信息。

  1. int conn_set( conn_t *conn, char *set_url )
复制代码
用一个url来构造conn_t数据结构,操作包括:

根据http://xxx或者ftp://xx来识别是ftp还是http协议。
拷贝URL地址
接续要下载文件的basename和dir,ftp或者http的主机地址,用户名,密码和服务端口等。

  1. char *conn_url( conn_t *conn );
复制代码
根据conn的协议类型,构造一个标准的http或者Ftp的URL地址

  1. void conn_disconnect( conn_t *conn );
复制代码
断开连接

  1. int conn_init( conn_t *conn );
复制代码
打开到http服务器的连接或者打开到FTP服务器的连接并且切换到ftp的下载目录

  1. int conn_setup( conn_t *conn );
复制代码
发出文件请求,并读取返回控制信息,而不读取实际数据

  1. int conn_exec( conn_t *conn )
复制代码
执行ftp或者http请求,并且读取返回的控制信息,而不读取文件数据
如果是ftp的话,发送RETR命令并且读取返回码,如果是http的话发送http request消息,只读取返回的http头数据.

  1. int conn_info( conn_t *conn )
复制代码
通过连接获取要下载文件的大小和其它信息,FTP的话,要测试断点续传功能。http的话,要获取头信息.

论坛徽章:
0
发表于 2011-09-27 10:55 |显示全部楼层
看来我肯定会要参与的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP