亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: duanjigang
打印 上一主題 下一主題

源碼閱讀第一期:axel和wget [復(fù)制鏈接]

論壇徽章:
0
71 [報告]
發(fā)表于 2011-09-30 16:59 |只看該作者
還不知道axel

論壇徽章:
0
72 [報告]
發(fā)表于 2011-09-30 18:37 |只看該作者
先 mark 一下,小弟慢慢拜讀
只怪功力不足啊,看見那么多代碼都不知道從何下手

論壇徽章:
0
73 [報告]
發(fā)表于 2011-10-01 14:11 |只看該作者
本帖最后由 wangzhen11aaa 于 2011-10-01 14:44 編輯

說到這里:static long i100afunc(long *address)這個函數(shù)是試探可用堆棧的大小。

  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. /*這段函數(shù)是找到本程序所用到的堆棧尾*/
  12. 這個trailer是個很特別的空間,將堆棧內(nèi)各個段聯(lián)系起來
  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. /*這段函數(shù)顯然一直到程序堆棧末尾加入可以分配空間大小。內(nèi)核為此堆棧分配的空間是有限的,不夠是可以擴展的do_page_fault()....*/
  24. 最終是return result;
復(fù)制代碼

_____________________________________________________________________________________________
___________------------>返回到alloca()函數(shù) /*/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. /*這段函數(shù)是個神奇的函數(shù),堆棧地址0上再分配一個dummy,然后利用104行來判斷方向,并且用addr記錄此時可分配的空間,然后利用遞歸來相加得到可以最后得到的空間。*/
復(fù)制代碼
<--------------------________________________

  1. 返回到alloca
  2. {
  3. . . .
  4. {                          /*這個{是if的,因為看前面的定義這是一定執(zhí)行的*/
  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)) /*分別對應(yīng)堆棧生長的方向*/
  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)說明 內(nèi)存滿*/
  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 }
復(fù)制代碼

論壇徽章:
0
74 [報告]
發(fā)表于 2011-10-01 15:11 |只看該作者
<--------------____________
函數(shù)返回到fnmatch_nocase()  /* /src/utils.c*/
剛才的alloca函數(shù)帶回了可以分配的資源。貌似軍隊上的補記來了!敬禮!*/

  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 轉(zhuǎn)化為小寫字母 /
  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函數(shù)進行字符通配,比如匹配*、?等字符fnmatch.c*/
  11. 866 #endif
  12. 867 }
復(fù)制代碼
_____________------------>

  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);  /*另一中轉(zhuǎn)化方式,如果是大寫,那么轉(zhuǎn)化成小寫,小寫不變*/
  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 }
復(fù)制代碼
<----------_______________
這里徹底返回到  test_dir_matches_p()函數(shù)
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
75 [報告]
發(fā)表于 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 數(shù)據(jù)結(jié)構(gòu)定義在  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就覺得很舒坦,現(xiàn)在知道支持很多命令的,而且適合opotion結(jié)構(gòu)體是相對應(yīng)的。*/
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 };
/*此段函數(shù)只是保證,command為這個順序*/
這里再強調(diào)下
  3  ____------>
#define mu_insert(message, test) do{ if (!(test)) return message; } while(0);
/*test為0時才會打印錯誤信息*/

論壇徽章:
0
76 [報告]
發(fā)表于 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); /*跟前面相同,是測試使用,看結(jié)果的設(shè)置和否符合預(yù)期*/
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; /*文件名限制規(guī)則*/
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
77 [報告]
發(fā)表于 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);  /*從堆中分配目的先檢查是否會出現(xià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) /*函數(shù)為路徑選擇規(guī)則,就不講了*/
此檢查可以結(jié)束了。

評分

參與人數(shù) 1可用積分 +5 收起 理由
duanjigang + 5 辛苦了!

查看全部評分

論壇徽章:
0
78 [報告]
發(fā)表于 2011-10-01 22:30 |只看該作者
本帖最后由 duanjigang 于 2011-10-01 23:35 編輯

連接存儲結(jié)構(gòu)體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
復(fù)制代碼
表示連接的信息

conf       

配置信息,很明顯,這個配置來源于axel初始化加載的配置
proto       

協(xié)議,F(xiàn)TP或者HTTP
port       

網(wǎng)絡(luò)連接中使用的端口值,默認FTP為21,HTTP為80端口,如果你提供給axel的URL中包含了端口值的話,會解析并且使用指定的值.
        在axl中對conn->port賦值的有好幾個情況。第一:從提供的URL中解析。第二:從系統(tǒng)的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協(xié)議的話,會寫入匿名用戶名和密碼(默認值)
ftp和http       
ftp和http下載時使用對象,上面已經(jīng)解釋過了。
size       
要下載的文件總的大小(而不是一個連接應(yīng)該下載的大小)

currentbyte               
當前連接應(yīng)該開始下載的位置,也就是每個連接的開始下載位置,比如1000字節(jié)文件,5個連接,每個連接的開始位置為1,201,401,601,801

lastbyte               
當前連接結(jié)束下載的位置,比如1000字節(jié)文件,5個連接,每個連接的結(jié)束位置為200,400,600,800,1000

fd               
每個連接網(wǎng)絡(luò)通訊的socket描述符
enable               

用來標識連接的可用性,連接失敗,或者傳輸失敗時都會置為0
supported
測試是否支持FTP斷點續(xù)傳和重新嘗試下載
last_transfer       
一個連接最后一次進行網(wǎng)絡(luò)傳輸?shù)臅r間,用來做超時檢測和下載速度計算

message       
存儲網(wǎng)絡(luò)連接中的返回值,錯誤信息,以及axel自身的報錯等信息

local_if       
使用的本地主機地址列表
state       
存儲連接的狀態(tài),0無效,否則有效


setup_thread       

連接建立的線程函數(shù)體,在axel中每個線程的連接建立過程正好是通過一個叫setup_thread的線程來完成的

論壇徽章:
0
79 [報告]
發(fā)表于 2011-10-01 23:00 |只看該作者
本帖最后由 duanjigang 于 2011-10-01 23:06 編輯

鏡像文件查找結(jié)構(gòu)體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;
復(fù)制代碼
查找鏡像時使用的對象

url
        用來存儲搜索到的鏡像文件地址

speed_start_time

        因為在計算速度時是通過一個時間段的時差或者這個時間段的下載量來計算的,因此每次計算都需要一個起始時間,這個成員就是出于此目的

speed, size

        speed存儲查找鏡像后,各個鏡像地址的響應(yīng)的速度,實際上存儲的是響應(yīng)時間,時間越大,速度越小
        size 用來存儲各個站點下載的文件的大小,查找列表第一個位置的search_t中的size是源站點的文件大小,其它search_t的size是查找到的鏡像文件的大小.
        當然鏡像URL中獲取的size如果和源不一樣大,認為是錯誤的。


speed_thread               

測試線程,測試每個下載連接的下載速度用
conf               

配置信息,從axel加載的配置中拷貝過來的

論壇徽章:
0
80 [報告]
發(fā)表于 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;
復(fù)制代碼
表示一個axel對象
conn       
        一個axel下載對象對應(yīng)的連接
conf       
        一個axel下載對象的配置,是從axel初始化的conf中拷貝過來的
filename
        要下載的文件名

start_time
        一個Axel開始下載的時間

next_state       

        下一次寫入狀態(tài)文件的時間

finish_time
        結(jié)束下載的時間點
bytes_done
        已經(jīng)下載了多少字節(jié)

start_byte
        開始下載的字節(jié)

size
        要下載的文件大小
bytes_per_second
        每秒平均下載字節(jié)數(shù)

delay_time
        為了平滑下載速度,使得下載速度不要超過設(shè)定的限制,需要sleep一個時間段后再接著下載,delay_time就是這個時間間隔
outfd
        寫文件的文件描述符
ready
        標志位,是否已經(jīng)準備好下載了
message
        用來存儲一個axel下載過程中的信息,日志等消息
url
        每個axel下載的來源URL,可能為源地址或者鏡像文件地址
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP