免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanjigang
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2011-09-27 10:56 |只看该作者
ftp.h
ftp.c


主要针对ftp协议的操作实现:

  1. int ftp_connect( ftp_t *conn, char *host, int port, char *user, char *pass );
复制代码
连接ftp服务器,发送USER和PASS数据,设置二进制传输模式,并且获取返回结果.

  1. void ftp_disconnect( ftp_t *conn );
复制代码
断开ftp连接

  1. int ftp_wait( ftp_t *conn );
复制代码
每发送一个ftp命令后,都通过该函数来读取FTP的返回码

  1. int ftp_command( ftp_t *conn, char *format, ... );
复制代码
发送FTP命令到服务器

  1. int ftp_cwd( ftp_t *conn, char *cwd );
复制代码
改变FTP操作目录

  1. int ftp_data( ftp_t *conn );
复制代码
开始数据连接,设置为PASV模式

  1. long long int ftp_size( ftp_t *conn, char *file, int maxredir );
复制代码
通过SIZE或者LIST命名获取文件大小

论坛徽章:
0
22 [报告]
发表于 2011-09-27 10:58 |只看该作者
http.h
http.c

类似于ftp,主要进行http协议相关操作的实现.

http_t定义了http协议需要的信息。

  1. int http_connect( http_t *conn, int proto, char *proxy, char *host, int port, char *user, char *pass );
复制代码
通过tcp socket的方式,结合参数中提供的代理,主机,端口,用户名和密码等信息,连接http服务器。

  1. void http_disconnect( http_t *conn );
复制代码
断开http连接

  1. void http_get( http_t *conn, char *lurl );
复制代码
在连接conn中添加对于ULR地址lurl的GET头信息。
并且设置HTTP头中的range字段

  1. void http_addheader( http_t *conn, char *format, ... );
复制代码
原子函数,向http连接中添加http头信息.

  1. int http_exec( http_t *conn );
复制代码
发送http reques消息,并且读取返回信息,但是不读取返回的文件数据.

  1. char *http_header( http_t *conn, char *header );
复制代码
查找conn返回到http数据中的名字为header的字段的值

  1. long long int http_size( http_t *conn );
复制代码
获取http下载的文件大小, 通过解析 "Content-Length:"来实现.

  1. void http_encode( char *s );
复制代码
http加密

  1. void http_decode( char *s );
复制代码
http解密

论坛徽章:
0
23 [报告]
发表于 2011-09-27 11:00 |只看该作者
search.h
search.c

如果使用Axel时输入了 -S [x]参数的话
axel就会在下载之前去www.filesearch.com查找对应要下载文件的镜像站点,并且根据输入的X的值,获取前X个镜像文件的URL地址。

search.c就是实现这些功能的地方.

  1. int search_makelist( search_t *results, char *url );
复制代码
首先连接文件源地址,获取文件信息,失败的话就返回。
然后通过要下载的文件信息,构造一个访问www.filesearching.com的URL地址。
发送http请求到这个URL地址。
然后循环中读取http返回页面中的内容,从中解析获取到的镜像文件的URL地址,存储到results数组中。

  1. int search_getspeeds( search_t *results, int count );
复制代码
已经获取到镜像文件的URL地址了,然后通过多线程方式,在每个线程中去访问每一个镜像文件,测试该站点的访问速度。
访问速度是根据访问时间计算出来的,时间越大,速度越大。(这个速度越大,说明响应慢)

  1. void search_sortlist( search_t *results, int count );
复制代码
通过qsort来对N个镜像站点进行排名,按照访问速度,根据原理来分析,应该是speed值大,说明响应慢,速度小,这样去排序。
但是我对于快排函数int search_sortlist_qsort( const void *a, const void *b )
的实现m没太看明白,希望有朋友帮忙解释。


==========================
tcp.h
tcp.c


简单的TCP接口封装

  1. int tcp_connect( char *hostname, int port, char *local_if );
复制代码
连接主机hostname, 绑定本地地址为local_if

  1. int get_if_ip( char *iface, char *ip );
复制代码
//获取iface的地址

论坛徽章:
0
24 [报告]
发表于 2011-09-27 11:02 |只看该作者
本帖最后由 duanjigang 于 2011-09-27 11:03 编辑

text.c

这个文件是axelmain函数实现的地方(很奇怪,axel的作者没有把main放在axel.c中而放在text.c中,这对于刚接触axel的人,会觉得不太舒服,coding风格有问题^_^)

下面集中介绍main函数中的流程:

调用conf_init,从环境变量中加载配置
调用getopt_long解析命令行参数

如果配置查找镜像文件的话,查找镜像文件地址,构造列表。获取每个镜像文件的站点访问速度,进行速度排序,创建axel对象。
如果没有配置查找镜像的话,用源连接创造axel对象。
如果指定了多个URL地址去下载,为每一个地址创建一个axel对象

创建存储文件(临时文件)。
打开下载的连接。
注册停止信号


然后进入循环,当没有下载完或者没有收到停止信号时,执行以下操作:

进入axel_do函数,进行文件数据接收。
然后打印进度

当下载完成时,打印结果和速度等信息
关闭连接.

============================================
到目前,把axel的主题函数功能都列出来了。
有问题的地方吗,欢迎诸路朋友及时提出喔

论坛徽章:
0
25 [报告]
发表于 2011-09-27 11:07 |只看该作者
看来我肯定会要参与的了。
wlzhuce 发表于 2011-09-27 10:55



    呵呵,热烈欢迎啊,curl和wget选一个?:wink: 众人拾材火焰高

论坛徽章:
0
26 [报告]
发表于 2011-09-27 11:15 |只看该作者
学习学习!

论坛徽章:
0
27 [报告]
发表于 2011-09-27 12:45 |只看该作者
绝对参与。以学习态度强烈支持!

论坛徽章:
0
28 [报告]
发表于 2011-09-27 14:56 |只看该作者
本帖最后由 c04n05 于 2011-09-27 15:02 编辑
search.h
search.c
如果使用Axel时输入了 -S [x]参数的话
axel就会在下载之前去查找对应要下载文件的镜像 ...
duanjigang 发表于 2011-09-27 11:00
  1. int search_sortlist_qsort( const void *a, const void *b )
  2. {
  3.         if( ((search_t *)a)->speed < 0 && ((search_t *)b)->speed > 0 )
  4.                 return( 1 );
  5.         if( ((search_t *)a)->speed > 0 && ((search_t *)b)->speed < 0 )
  6.                 return( -1 );
  7.         if( ((search_t *)a)->speed < ((search_t *)b)->speed )
  8.                 return( -1 );
  9.         else
  10.                 return( ((search_t *)a)->speed > ((search_t *)b)->speed );
  11. }
复制代码
。。。不知道先和0比较有啥子意义没?
ps:这个不是快排函数,只是给上面那个qsort用来比较而已。快排是qsort函数实现。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
29 [报告]
发表于 2011-09-27 15:30 |只看该作者
看着太不连贯了。。。

论坛徽章:
0
30 [报告]
发表于 2011-09-27 20:25 |只看该作者
。。。不知道先和0比较有啥子意义没?
ps:这个不是快排函数,只是给上面那个qsort用来比较而已。快排是qso ...
c04n05 发表于 2011-09-27 14:56



    前两个if我觉得还对,< 返回1, >返回-1,这样正好,说明时间大的速度慢,时间小的速度快
但是第三个if和else就跟前两个if相反了。赫赫,我再看看代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP