免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2011-09-30 18:37 |只看该作者
先 mark 一下,小弟慢慢拜读
只怪功力不足啊,看见那么多代码都不知道从何下手

论坛徽章:
0
72 [报告]
发表于 2011-10-01 14:11 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-01 14:44 编辑

说到这里:static long i100afunc(long *address)这个函数是试探可用堆栈的大小。

  1. 360   while (trailer != 0)
  2. 361     {
  3. 362       block = (long *) trailer->this_address;
  4. 363       size = trailer->this_size;
  5. 364       if (block == 0 || size == 0)
  6. 365         abort ();
  7. 366       trailer = (struct stk_trailer *) trailer->link;  
  8. 367       if ((block <= address) && (address < (block + size)))
  9. 368         break;
  10. 369     }
  11. /*这段函数是找到本程序所用到的堆栈尾*/
  12. 这个trailer是个很特别的空间,将堆栈内各个段联系起来
  13. result = address - block;是将从本地址开始的计入可以分配空间。
  14. . .  .
  15. 381   do
  16. 382     {
  17. 383       if (trailer->this_size <= 0)
  18. 384         abort ();
  19. 385       result += trailer->this_size;
  20. 386       trailer = (struct stk_trailer *) trailer->link;
  21. 387     }
  22. 388   while (trailer != 0);
  23. /*这段函数显然一直到程序堆栈末尾加入可以分配空间大小。内核为此堆栈分配的空间是有限的,不够是可以扩展的do_page_fault()....*/
  24. 最终是return result;
复制代码

_____________________________________________________________________________________________
___________------------>返回到alloca()函数 /*/lib/alloca.c*/

  1. [code]
  2. alloca()
  3. {
  4. . . .
  5. #if STACK_DIRECTION == 0
  6. if (STACK_DIR == 0)  /*这是堆栈扩展方向不明*/
  7.   STACK_DIR = find_stack_direction(NULL, (size & 1) + 20); /*/lib/alloca.c__________----------->*/
  8. . . .
  9. }

  10. static int  find_stack_direction(int *addr, int depth)
  11. {
  12.    101   int dir, dummy = 0;
  13. 102   if (! addr)
  14. 103     addr = &dummy;
  15. 104   *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
  16. 105   dir = depth ? find_stack_direction (addr, depth - 1) : 0;
  17. 106   return dir + dummy;
  18. 107
  19. }
  20. /*这段函数是个神奇的函数,堆栈地址0上再分配一个dummy,然后利用104行来判断方向,并且用addr记录此时可分配的空间,然后利用递归来相加得到可以最后得到的空间。*/
复制代码
<--------------------________________________

  1. 返回到alloca
  2. {
  3. . . .
  4. {                          /*这个{是if的,因为看前面的定义这是一定执行的*/
  5. register header *hp; /*Traverses linked list_______------->/lib/alloca.c*/
  6. .. .. ..
  7. }
  8. __________--------------->
  9. typedef union hdr
  10. {
  11.    char alain[ALAIN_SIZE];   /*#define ALIGN_SIZE sizeof(double) 长度是8,这是对齐作用*/
  12.    struct {
  13.      union hdr *next; /*链上的元素*/
  14.      char *deep;   /*测试堆栈的深度*/
  15.   } h;
  16. }header;
  17. /*这是来收集上次分配所有空间*/
  18. <-------------____________[code]
  19. alloca ()
  20. {
  21. . . . .
  22. 162     for (hp = last_alloca_header; hp != NULL;)  /*#define  *last_alloca_header  = NULL */
  23. 163       if ((STACK_DIR > 0 && hp->h.deep > depth)
  24. 164           || (STACK_DIR < 0 && hp->h.deep < depth)) /*分别对应堆栈生长的方向*/
  25. 165         {
  26. 166           register header *np = hp->h.next;
  27. 167
  28. 168           free (hp);            /* Collect garbage.  */
  29. 169
  30. 170           hp = np;              /* -> next header.  */
  31. 171         }
  32. 172       else
  33. 173         break;                  /* Rest are not deeper.  */
  34. 174
  35. 175     last_alloca_header = hp;    /* -> last valid storage.  */
  36. 176
  37.          . . .
  38.   

  39. 180   }
  40.    . . .

  41. 189     register header *new;
  42. 190
  43. 191     size_t combined_size = sizeof (header) + size;   
  44. 192     if (combined_size < sizeof (header))  /*如果size + size0f(header) < sizeof(header)说明 内存满*/
  45. 193       memory_full ();  /*#define memeory_full() abort() ,就是挂掉*/
  46. 194
  47. 195     new = malloc (combined_size);   /*堆中非配记录空间*/
  48. 196
  49. 197     if (! new)
  50. 198       memory_full ();   
  51. 199
  52. 200     new->h.next = last_alloca_header;
  53. 201     new->h.deep = depth;  
  54. 202
  55. 203     last_alloca_header = new;
  56. 204
  57. 205     /* User storage begins just after header.  */
  58. 206
  59. 207     return (void *) (new + 1);  /*返回一个记录的地址*/
  60. 208   }
  61. 209 }
复制代码

论坛徽章:
0
73 [报告]
发表于 2011-10-01 15:11 |只看该作者
<--------------____________
函数返回到fnmatch_nocase()  /* /src/utils.c*/
刚才的alloca函数带回了可以分配的资源。貌似军队上的补记来了!敬礼!*/

  1. 856   char *patcopy = (char *) alloca (strlen (pattern) + 1);
  2. 857   char *strcopy = (char *) alloca (strlen (string) + 1);
  3. 858   char *p;
  4. 859   for (p = patcopy; *pattern; pattern++, p++)
  5. 860     *p = c_tolower (*pattern);  /*_____------>/lib/c-ctype.c 转化为小写字母 /
  6. 861   *p = '\0';
  7. 862   for (p = strcopy; *string; string++, p++)
  8. 863     *p = c_tolower (*string);     
  9. 864   *p = '\0';
  10. 865   return fnmatch (patcopy, strcopy, flags);  /*fnmatch函数进行字符通配,比如匹配*、?等字符fnmatch.c*/
  11. 866 #endif
  12. 867 }
复制代码
_____________------------>

  1. 323 c_tolower (int c)
  2. 324 {
  3. 325 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  4. 326   return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);  /*另一中转化方式,如果是大写,那么转化成小写,小写不变*/
  5. 327 #else
  6. 328   switch (c)
  7. 329     {
  8. 330     case 'A': return 'a';
  9. 331     case 'B': return 'b';
  10. 332     case 'C': return 'c';
  11. 333     case 'D': return 'd';
  12. 334     case 'E': return 'e';
  13. 335     case 'F': return 'f';
  14. 336     case 'G': return 'g';
  15. 337     case 'H': return 'h';
  16. 338     case 'I': return 'i';
  17. 339     case 'J': return 'j';
  18. 340     case 'K': return 'k';
  19. 341     case 'L': return 'l';
  20. 342     case 'M': return 'm';
  21. 343     case 'N': return 'n';
  22. 344     case 'O': return 'o';
  23. 345     case 'P': return 'p';
  24. 346     case 'Q': return 'q';
  25. 347     case 'R': return 'r';
  26. 348     case 'S': return 's';
  27. 349     case 'T': return 't';
  28. 350     case 'U': return 'u';
  29. 351     case 'V': return 'v';
  30. 352     case 'W': return 'w';
  31. 353     case 'X': return 'x';
  32. 354     case 'Y': return 'y';
  33. 355     case 'Z': return 'z';
  34. 357     }
  35. 358 #endif
  36. 359 }
复制代码
<----------_______________
这里彻底返回到  test_dir_matches_p()函数
test_dir_matches_p()
{
2417       bool res = dir_matches_p (test_array.dirlist, test_array.dir);
2418
2419       mu_assert ("test_dir_matches_p: wrong result",
2420                  res == test_array.result);
2421     }
2422
2423   return NULL;
2424 }
/*测试完毕*/
________________________________END ____________________________________IN__TEST_DIR__MATCHES_P____________________________

论坛徽章:
0
74 [报告]
发表于 2011-10-01 15:56 |只看该作者
<---------_____________
mu_run_test (test_commands_sorted);/*___----->/src/init.c*/

1649 const char *
1650 test_commands_sorted()
1651 {
1652   int prev_idx = 0, next_idx = 1;
1653   int command_count = countof (commands) - 1;/*  1 ______----->/src/wget.h commands 数据结构定义在  2________--------->/src/init.c*/
1654   int cmp = 0;
1655   while (next_idx <= command_count)
1656     {
1657       cmp = strcasecmp (commands[prev_idx].name, commands[next_idx].name);
1658       if (cmp > 0)
1659         {
1660           mu_assert ("FAILED", false);  /* 3____------>/src/test.h*/
1661           break;
1662         }
1663       else
1664         {
1665           prev_idx ++;
1666           next_idx ++;
1667         }
1668     }
1669   return NULL;
1670 }
1   _________-------->
/*src/wget.h*/
#define countof(array) (sizeof (array) /sizeof ((array) [0]))
2___________--------->实在太多了!!!!!!!想想当初自己用wget xxx.xxx.xxx.xxx/xxx就觉得很舒坦,现在知道支持很多命令的,而且适合opotion结构体是相对应的。*/
111 static const struct {
112   const char *name;
113   void *place;
114   bool (*action) (const char *, const char *, void *);
115 } commands[] = {
116   /* KEEP THIS LIST ALPHABETICALLY SORTED */
117   { "accept",           &opt.accepts,           cmd_vector },
118   { "addhostdir",       &opt.add_hostdir,       cmd_boolean },
119   { "adjustextension",  &opt.adjust_extension,  cmd_boolean },
120   { "alwaysrest",       &opt.always_rest,       cmd_boolean }, /* deprecated */
121   { "askpassword",      &opt.ask_passwd,        cmd_boolean },
122   { "authnochallenge",  &opt.auth_without_challenge,
123                                                 cmd_boolean },
124   { "background",       &opt.background,        cmd_boolean },
125   { "backupconverted",  &opt.backup_converted,  cmd_boolean },
126   { "backups",          &opt.backups,           cmd_number },
127   { "base",             &opt.base_href,         cmd_string },
128   { "bindaddress",      &opt.bind_address,      cmd_string },
129 #ifdef HAVE_SSL
130   { "cacertificate",    &opt.ca_cert,           cmd_file },
131 #endif
132   { "cache",            &opt.allow_cache,       cmd_boolean },
133 #ifdef HAVE_SSL
134   { "cadirectory",      &opt.ca_directory,      cmd_directory },
135   { "certificate",      &opt.cert_file,         cmd_file },
136   { "certificatetype",  &opt.cert_type,         cmd_cert_type },
137   { "checkcertificate", &opt.check_cert,        cmd_boolean },
138 #endif
139   { "chooseconfig",     &opt.choose_config,     cmd_file },
140   { "connecttimeout",   &opt.connect_timeout,   cmd_time },
141   { "contentdisposition", &opt.content_disposition, cmd_boolean },
142   { "continue",         &opt.always_rest,       cmd_boolean },
143   { "convertlinks",     &opt.convert_links,     cmd_boolean },
144   { "cookies",          &opt.cookies,           cmd_boolean },
. . . . . .
261   { "useragent",        NULL,                   cmd_spec_useragent },
262   { "useservertimestamps", &opt.useservertimestamps, cmd_boolean },
263   { "verbose",          NULL,                   cmd_spec_verbose },
264   { "wait",             &opt.wait,              cmd_time },
265   { "waitretry",        &opt.waitretry,         cmd_time },
266 #ifdef USE_WATT32
267   { "wdebug",           &opt.wdebug,            cmd_boolean },
268 #endif
269 };
/*此段函数只是保证,command为这个顺序*/
这里再强调下
  3  ____------>
#define mu_insert(message, test) do{ if (!(test)) return message; } while(0);
/*test为0时才会打印错误信息*/

论坛徽章:
0
75 [报告]
发表于 2011-10-01 21:04 |只看该作者
<---------__________
返回到all_tests()
{
. . . . . .      
mu_run_test(test_cmd_spec_restrict_file_names);/* ____________---------->/src/init.c*/
. . . . .
}
___________------------>
test_cmd_spec_restrict_file_names()
1673 test_cmd_spec_restrict_file_names()
1674 {
1675   int i;
1676   struct {
1677     char *val;
1678     int expected_restrict_files_os;
1679     int expected_restrict_files_ctrl;
1680     int expected_restrict_files_case;
1681     bool result;
1682   } test_array[] = {
1683     { "windows", restrict_windows, true, restrict_no_case_restriction, true      },   
1684     { "windows,", restrict_windows, true, restrict_no_case_restriction, tru     e },
1685     { "windows,lowercase", restrict_windows, true, restrict_lowercase, true      },
1686     { "unix,nocontrol,lowercase,", restrict_unix, false, restrict_lowercase     , true },
1687   };
1688
1689   for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i)
1690     {
1691       bool res;
1692
1693       defaults();   1、  _______________---------------->/*init.c*/
1694       res = cmd_spec_restrict_file_names ("dummy", test_array[i].val, NULL)     ;/*2 、___------>init.c */
1695  . . . . . . .
1702       mu_assert ("test_cmd_spec_restrict_file_names: wrong result",
1703                  res == test_array[i].result
1704                  && opt.restrict_files_os   == test_array[i].expected_restrict_files_os
1705                  && opt.restrict_files_ctrl == test_array[i].expected_restrict_files_ctrl
1706                  && opt.restrict_files_case == test_array[i].expected_restrict_files_case); /*跟前面相同,是测试使用,看结果的设置和否符合预期*/
1707     }
1708
1709   return NULL;
1710 }
1   、_________________________---------------------->
defaults(void )
{
  char *tmp;
  xzero(opt);
  opt.cookies = true;
   . . . . . . .  
  
  /*对opotion的初始化*/
}
2、___________----------------->
static bool
1311 cmd_spec_restrict_file_names (const char *com, const char *val, v     oid *place_ignored)
1312 {
1313   int restrict_os = opt.restrict_files_os; /*文件名限制规则*/
1314   int restrict_ctrl = opt.restrict_files_ctrl;/*如果控制字符被限制从一般文件名中显示,此为非零*/
1315   int restrict_case = opt.restrict_files_case;/*文件名字类型限制*/
1316   int restrict_nonascii = opt.restrict_files_nonascii;/*如果字符大于127被禁止的话,那么此为非0*/
1317                                    /*全部见下方3、_____---------->*/
1318   const char *end;
1319
1320 #define VAL_IS(string_literal) BOUNDED_EQUAL (val, end, string_literal) /*4、_______------->/src/wget.c*/
1321
1322   do
1323     {
1324       end = strchr (val, ','); /*查找第一个,看前面的的定义*/
1325       if (!end)                     
1326         end = val + strlen (val);   /*如果end返回为NULL,那么就End 指向末尾位置*/
1327                            /*依次赋值*/
1328       if (VAL_IS ("unix"))  
1329         restrict_os = restrict_unix;  
1330       else if (VAL_IS ("windows"))
1331         restrict_os = restrict_windows;
1332       else if (VAL_IS ("lowercase"))
1333         restrict_case = restrict_lowercase;
1334       else if (VAL_IS ("uppercase"))
1335         restrict_case = restrict_uppercase;
1336       else if (VAL_IS ("nocontrol"))
1337         restrict_ctrl = false;
1338       else if (VAL_IS ("ascii"))
1339         restrict_nonascii = true;
1340       else
1341         {
1342           fprintf (stderr, _("\
1343 %s: %s: Invalid restriction %s,\n\
1344     use [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].     \n"),
1345                    exec_name, com, quote (val));
1346           return false;
1347         }
1348
1349       if (*end)
1350         val = end + 1; /*将end指向的地址加一就是下个字符串的地址*/
1351     }
1352   while (*val && *end);
1353
1354 #undef VAL_IS
1355
1356   opt.restrict_files_os = restrict_os;
1357   opt.restrict_files_ctrl = restrict_ctrl;
1358   opt.restrict_files_case = restrict_case;
1359   opt.restrict_files_nonascii = restrict_nonascii;
1360
1361   return true;
1362 }
3 、______________________________----------------------------->
208   enum {
209     restrict_unix,
210     restrict_windows
211   } restrict_files_os;   /*win 和linux 命名文件名字是不同的*/
212   bool restrict_files_ctrl;   
217   enum {
218     restrict_no_case_restriction,  /*无格式限制*/   
219     restrict_lowercase,   /*限制小写*/
220     restrict_uppercase   /*限制大写*/
221   } restrict_files_case;  
215  bool restrict_files_nonascii;
4、______________----------------->
#define BOUNDED_EQUAL (beg, end, string_literal)
( ( end) - (beg) = sizeof(string_literal - 1) && !memcmp( beg, string_literal, sizeof(string_literal) -1 ))
/*--------------------------END ____ IN ------- FUNCTION-------------------------*/

论坛徽章:
0
76 [报告]
发表于 2011-10-01 21:31 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-01 21:52 编辑

<----------__________________
all_tests()
{
..... .. . . ..
mu_run_test(test_path_simlify); 1、_________-------->/*src/url.c*/
. . . . .
}
1 、 ____________--------------->
test_path_simplify(void )
2161 {
2162   static struct {
2163     char *test, *result;
2164     enum url_scheme scheme; /* 2、__________----------->in the src/url.c   */
2165     bool should_modify;
2166   } tests[] = {
2167     { "",                       "",             SCHEME_HTTP, false },
2168     { ".",                      "",             SCHEME_HTTP, true },
2169     { "./",                     "",             SCHEME_HTTP, true },
2170     { "..",                     "",             SCHEME_HTTP, true },
2171     { "../",                    "",             SCHEME_HTTP, true },
. . . . . .
}
2195   int i;
2196
2197   for (i = 0; i < countof (tests); i++)
2198     {
2199       const char *message;
2200       char *test = tests.test;
2201       char *expected_result = tests.result;
2202       enum url_scheme scheme = tests.scheme;
2203       bool  expected_change = tests.should_modify;
2204       message = run_test (test, expected_result, scheme, expected_change); /*3、____----->/src/url.c*/
2205       if (message) return message;
2206     }
2207   return NULL;
2208 }
2、_________--------->
enum  url_scheme{
SCHEME_HTTP,
#ifdef HAVE_SSL
SCHEME_HTTPS,
#endif
SCHEME_FTP,
SCHEME_INVALID
};
3、______--------->
static const char *
run_test(char *test, char *expected_result, enum url_scheme sheme, bool expected_chagnge)
{
2135 {
2136   char *test_copy = xstrdup (test);  /*4、______----------->/lib/xmalloc.c*/
2137   bool modified = path_simplify (scheme, test_copy);  /*7_____------->/src/urc.c*/
2138
2139   if (0 != strcmp (test_copy, expected_result))
2140     {
2141       printf ("Failed path_simplify(\"%s\"): expected \"%s\", got \"%s\".  \n",
2142               test, expected_result, test_copy);
2143       mu_assert ("", 0);
2144     }
2145   if (modified != expected_change)
2146     {
2147       if (expected_change)
2148         printf ("Expected modification with path_simplify(\"%s\").\n",
2149                 test);
2150       else
2151         printf ("Expected no modification with path_simplify(\"%s\").\n",
2152                 test);
2153     }
2154   xfree (test_copy);
2155   mu_assert ("", modified == expected_change);
2156   return NULL;
2157 }
4________---------->
char *xstrdup( char const *string)
{
   return xmemdup(string, strlen(string) + 1); /*5、___--->/lib/xmalloc.c*/
}
5、 ______----->
xmemdup(void const *p, size_t s)
{
  return memcpy(xmalloc(s), p, s);   /*6、___________-------> /lib/xmalloc.c*/
6、_____----------->
void *xmalloc (size_t n)
{
  void *p = malloc(n);  /*从堆中分配目的先检查是否会出现栈不够*/
  if ( ! p && n ! = 0)
    xalloc_die();  /*7、 ______________-----------> /lib/xmalloc.c*/
  return p;
}
7、___________________--------------------->
void xalloc_die(void )
{
   error(exit_failure, 0, "%s", _(memory exhausted"));
   abort( );
}


7、_____----------->
static bool path_simplify (enum url_scheme scheme, char *path) /*函数为路径选择规则,就不讲了*/
此检查可以结束了。

评分

参与人数 1可用积分 +5 收起 理由
duanjigang + 5 辛苦了!

查看全部评分

论坛徽章:
0
77 [报告]
发表于 2011-10-01 22:30 |只看该作者
本帖最后由 duanjigang 于 2011-10-01 23:35 编辑

连接存储结构体conn_t

  1. typedef struct
  2. {
  3.         conf_t *conf;
  4.         int proto;
  5.         int port;
  6.         int proxy;
  7.         char host[MAX_STRING];
  8.         char dir[MAX_STRING];
  9.         char file[MAX_STRING];
  10.         char user[MAX_STRING];
  11.         char pass[MAX_STRING];
  12.         ftp_t ftp[1];
  13.         http_t http[1];
  14.         long long int size;                /* File size, not 'connection size'..        */
  15.         long long int currentbyte;
  16.         long long int lastbyte;
  17.         int fd;
  18.         int enabled;
  19.         int supported;
  20.         int last_transfer;
  21.         char *message;
  22.         char *local_if;
  23.         int state;
  24.         pthread_t setup_thread[1];
  25. } conn_t
复制代码
表示连接的信息

conf       

配置信息,很明显,这个配置来源于axel初始化加载的配置
proto       

协议,FTP或者HTTP
port       

网络连接中使用的端口值,默认FTP为21,HTTP为80端口,如果你提供给axel的URL中包含了端口值的话,会解析并且使用指定的值.
        在axl中对conn->port赋值的有好几个情况。第一:从提供的URL中解析。第二:从系统的service文件中赋值。第三:默认值.
proxy       
   使用代理的标志位,0不使用代理,否则使用代理
host       
axel 接受的URL字符串存储的缓冲
dir       
axel接受的URL中解析的目录名称,比如 www.test.con/url/book/2011/09/1.pdf中conn->dir 为 /url/book/2011/09
        而 ww.test.com/1.pdf中的conn->dir为/
file       
url的basename,如上面例子中的1.pdf
user 和pass       
从url中解析的用户名和密码,如果是ftp协议的话,会写入匿名用户名和密码(默认值)
ftp和http       
ftp和http下载时使用对象,上面已经解释过了。
size       
要下载的文件总的大小(而不是一个连接应该下载的大小)

currentbyte               
当前连接应该开始下载的位置,也就是每个连接的开始下载位置,比如1000字节文件,5个连接,每个连接的开始位置为1,201,401,601,801

lastbyte               
当前连接结束下载的位置,比如1000字节文件,5个连接,每个连接的结束位置为200,400,600,800,1000

fd               
每个连接网络通讯的socket描述符
enable               

用来标识连接的可用性,连接失败,或者传输失败时都会置为0
supported
测试是否支持FTP断点续传和重新尝试下载
last_transfer       
一个连接最后一次进行网络传输的时间,用来做超时检测和下载速度计算

message       
存储网络连接中的返回值,错误信息,以及axel自身的报错等信息

local_if       
使用的本地主机地址列表
state       
存储连接的状态,0无效,否则有效


setup_thread       

连接建立的线程函数体,在axel中每个线程的连接建立过程正好是通过一个叫setup_thread的线程来完成的

论坛徽章:
0
78 [报告]
发表于 2011-10-01 23:00 |只看该作者
本帖最后由 duanjigang 于 2011-10-01 23:06 编辑

镜像文件查找结构体search_t

  1. typedef struct

  2. {
  3.         char url[MAX_STRING];
  4.         double speed_start_time;
  5.         int speed, size;
  6.         pthread_t speed_thread[1];
  7.         conf_t *conf;
  8. } search_t;
复制代码
查找镜像时使用的对象

url
        用来存储搜索到的镜像文件地址

speed_start_time

        因为在计算速度时是通过一个时间段的时差或者这个时间段的下载量来计算的,因此每次计算都需要一个起始时间,这个成员就是出于此目的

speed, size

        speed存储查找镜像后,各个镜像地址的响应的速度,实际上存储的是响应时间,时间越大,速度越小
        size 用来存储各个站点下载的文件的大小,查找列表第一个位置的search_t中的size是源站点的文件大小,其它search_t的size是查找到的镜像文件的大小.
        当然镜像URL中获取的size如果和源不一样大,认为是错误的。


speed_thread               

测试线程,测试每个下载连接的下载速度用
conf               

配置信息,从axel加载的配置中拷贝过来的

论坛徽章:
0
79 [报告]
发表于 2011-10-01 23:38 |只看该作者
本帖最后由 duanjigang 于 2011-10-01 23:40 编辑

最终下载过程描述对象axel_t

  1. typedef struct
  2. {
  3.         conn_t *conn;
  4.         conf_t conf[1];
  5.         char filename[MAX_STRING];
  6.         double start_time;
  7.         int next_state, finish_time;
  8.         long long bytes_done, start_byte, size;
  9.         int bytes_per_second;
  10.         int delay_time;
  11.         int outfd;
  12.         int ready;
  13.         message_t *message;
  14.         url_t *url;
  15. } axel_t;
复制代码
表示一个axel对象
conn       
        一个axel下载对象对应的连接
conf       
        一个axel下载对象的配置,是从axel初始化的conf中拷贝过来的
filename
        要下载的文件名

start_time
        一个Axel开始下载的时间

next_state       

        下一次写入状态文件的时间

finish_time
        结束下载的时间点
bytes_done
        已经下载了多少字节

start_byte
        开始下载的字节

size
        要下载的文件大小
bytes_per_second
        每秒平均下载字节数

delay_time
        为了平滑下载速度,使得下载速度不要超过设定的限制,需要sleep一个时间段后再接着下载,delay_time就是这个时间间隔
outfd
        写文件的文件描述符
ready
        标志位,是否已经准备好下载了
message
        用来存储一个axel下载过程中的信息,日志等消息
url
        每个axel下载的来源URL,可能为源地址或者镜像文件地址

论坛徽章:
0
80 [报告]
发表于 2011-10-01 23:42 |只看该作者
到今天为止,函数和数据结构的分析已经完成。

接下来对 搜索 和 下载 两部分的核心函数以及代码段做些分析,axel的分析就可以告一段落了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP