axel扩展数据类型分析:conf_t
- typedef struct
- {
- char default_filename[MAX_STRING]; //存储时的默认文件名称
- char http_proxy[MAX_STRING];
- char no_proxy[MAX_STRING];
- int strip_cgi_parameters;
- int save_state_interval;
- int connection_timeout;
- int reconnect_delay;
- int num_connections;
- int buffer_size;
- int max_speed;
- int verbose;
- int alternate_output;
- if_t *interfaces;
- int search_timeout;
- int search_threads;
- int search_amount;
- int search_top;
- int add_header_count;
- char add_header[MAX_ADD_HEADERS][MAX_STRING];
- char user_agent[MAX_STRING];
- } conf_t;
http_proxy:
http连接时代理服务器地址,axel首先会从环境变量中加载,如果没有配置的话,就尝试从本地配置文件加载http_proxy,如果找到
的话,会在函数connect_init中调用,主要用于http_connect函数,最终会在conn_set函数中进行解析。
比如,我们在http.c中的http_connect函数中
- sprintf( conn->host, "%s:%i", host, port );
- printf ("conn_set proxy:%s\n", proxy);
编辑文件:
- /usr/local/axel/etc/axelrc
- http_proxy = 61.152.108.19:8080
然后开始一个Axel的下载测试.
- ./axel [url]http://en.newhua.com/down/mysql-5.5.15-win32.zip[/url]
- conn_set proxy:61.152.108.19:8080
- conn_set proxy:61.152.108.19:8080
- conn_set proxy:61.152.108.19:8080
- ...... .......... [ 1.7KB/s]
- [ 16%] .......... .......... ........
no_proxy:
不用任何代理服务器,因为axel默认会从配置文件和环境变量中加载代理服务器的,也就是默认支持代理服务器的。
在函数conn.c:conn_init中和conf.c:conf_init中是关于这个配置的具体操作。关于no_proxy,一开始一直没搞明白参数跟实际代码实现的关系,因为
作者在conf_init中对no_proxy的值进行了整理,用0分隔开了原来用用逗号分割的串,no_proxy的值是从配置文件或者环境变量中加载的,注意,这里要区分命令行参数
的-N和 conf中的no_proxy.
-N 表示整个任务中都不使用代理,如果没有-N参数的话,系统默认是使用代理服务器的(只要http_proxy配置的话),而且http_proxy的代理服务器是全局配置。
经过分析了conn_init中的代码段后,才明白作者的意图:
- if( *conn->conf->http_proxy == 0 )
- {
- proxy = NULL;
- }
- else if( *conn->conf->no_proxy != 0 )
- {
- for( i = 0; ; i ++ )
- if( conn->conf->no_proxy[i] == 0 )
- {
- if( strstr( conn->host, host ) != NULL )
- proxy = NULL;
- host = &conn->conf->no_proxy[i+1];
- if( conn->conf->no_proxy[i+1] == 0 )
- break;
- }
- }
比如要下载N个资源文件,我可能会这样下载
- axel -n 10 url1 url2 url3 url4 ... urln
然后出于某些原因,直接访问是下载不了,或者速度较慢。这时有人会借助代理服务器去访问这些资源。于是,他在axel/etc/axelrc中配置了一个http代理
- http_proxy=janpanese_proxy.com:8080
但是我们知道http_proxy是一个全局的配置,然后要再次下载时,所有的任务都会使用这个代理服务器。
于是,我们会想到,我能不能配置某些资源下载时不使用用代理呢,so,no_proxy就是为这个想法而生的。
比如,我不想让urlM和ulrN这两个资源不使用代理,只需要在axelrc中配置
- no_proxy=urlM,urlN
- axel -n 10 url1 url2 url3 urlN ... urlM
测试这个作用,可以在conn_init中添加代码来验证:
conn.c:conn_init()函数中
- conn->proxy = proxy != NULL;
- printf ("====%s============no proxy-%d\n",conn->host, conn->proxy == NULL);
比如我配置了
- no_proxy=en.newhua.com
- ./axel [url]http://en.newhua.com/down/mysql-5.5.15-win32.zip[/url] [url]http://www.tao123.com/soft/XiaobaiSetup_3.1.0.exe[/url]
- ====en.newhua.com============no proxy-1
- ====www.tao123.com============no proxy-0
URL中是否扔掉cgi参数,也是从配置文件中加载
比如 www.xxx.com?id=1&name=test
如果开启的话,?后面的参数会被扔掉。默认该项为1.
save_state_interval:
axel的每个下载连接,会在一定间隔后把当前连接的下载状态写入到一个后缀为“.st”的状态文件中。这个项就是
配置这个时间间隔的,默认为10秒,从配置文件中加载配置的值.
connection_timeout:
每个连接的连接超时时间,如果连接失败了,会尝试重新连接,但是如果从开始到现在经过了connection_timeout时间还没连接上,就放弃
默认是45秒,从配置文件加载。
reconnect_delay:
重连延迟,连接失败后,过过久再次去尝试连接,默认20秒,从配置文件加载值。
num_connections:
分多个少个连接去下载,也就是-n后面输入的参数。默认为4个,从stdin和配置中加载.
buffer_size:
通讯和写文件时采用缓冲的大小,从配置文件中加载。默认5120.
max_speed:
最大下载速度,默认无限制,从配置中加载,一旦某个时刻计算的平均下载速度超过这个值的话,再次下载时就会睡眠多点时间,降低平均速度。
verbose:
日志打印开关
alternate_output:
打印进度的方式,也就是-a开启的功能,表示以scp或者wget方式打印进度。
interfaces:
通讯时使用的IP列表,从配置文件加载。
search_timeout:
查找镜像文件超时,默认10秒,从配置文件加载。
search_threads:
使用几个线程查找镜像文件,默认是3个,从配置文件加载。
search_amount:
查找镜像文件的个数,默认是15个,从配置文件加载
search_top:
从查找的镜像文件中获取速度最快的前几个作为下载源
注意:search_XX这几个配置的意义区别。
add_header_count:
添加http头的个数,从-H xx解析 比如 -H xxx -H yyy,获得值为2
add_header:
添加的http头的存储单元,最多允许添加10个header,每个限制长度为1024,从配置文件和stdin获取。
user_agent:
http头中的user-agent,从配置文件和stdin获取,-U后面的串。