免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
231 [报告]
发表于 2011-10-19 23:49 |只看该作者
回复 52# wangzhen11aaa


    你用的calltree命令是怎么安的,是那个系统的,弄了很久都没有安上

论坛徽章:
0
232 [报告]
发表于 2011-10-20 07:42 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-20 07:44 编辑

回复 231# goingstudy
centos 5.6
uname -r
2.6.39.1
具体的安装,当时我也费了功夫,我有帖子。
http://bbs.chinaunix.net/thread-3598298-1-1.html

论坛徽章:
0
233 [报告]
发表于 2011-10-20 09:48 |只看该作者
回复  duanjigang


    想问一下在axel中。针对ftp部分,会多次用到ftp_wait函数,用来寻找返回状态码 ...
seufy88 发表于 2011-10-19 16:17



    ftp_wait只是取狀態的,獲取完狀態後,一般做法都是獲取完狀態後關閉連接了。
因此後一次的ftp_wait和前一次的ftp_wait得到的數據是兩碼事。

论坛徽章:
0
234 [报告]
发表于 2011-10-20 09:52 |只看该作者
回复 230# humd2001


        這個原因比較簡單,因為 message_t 這個結構體是一個表示鏈狀結構的通用數據結構。
而 url 和 if 都能夠被這個結構體來表示。比如多個 URL 和多個網卡,都可以用鏈表來表示,因此 typedef 是有道理的

论坛徽章:
0
235 [报告]
发表于 2011-10-20 11:22 |只看该作者
回复 234# duanjigang


   你的意思是有点函数重载的思想了,我只是使用其中的某些东西,而又不是全部使用通用结构体,谢谢版主!

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
236 [报告]
发表于 2011-10-25 14:08 |只看该作者
本帖最后由 seufy88 于 2011-10-26 15:49 编辑

回复 234# duanjigang


    http_addheader中,request中的每一条信息是以"\r\n"分开的,而不是以"\n"
  1. void http_addheader( http_t *conn, char *format, ... )
  2. {
  3.         char s[MAX_STRING];
  4.         va_list params;
  5.        
  6.         va_start( params, format );
  7.         vsnprintf( s, MAX_STRING - 3, format, params );
  8.         strcat( s, "\r\n" );
  9.         va_end( params );
  10.        
  11.         strncat( conn->request, s, MAX_QUERY - strlen(conn->request) - 1);
  12. }
复制代码

论坛徽章:
0
237 [报告]
发表于 2011-10-25 17:44 |只看该作者
谢啦,正打算怎么看linux的源码呢,正好跟着 老牛们一块走

论坛徽章:
0
238 [报告]
发表于 2011-10-29 21:46 |只看该作者
回复 232# wangzhen11aaa


    以下是wget的hash.c中的函数hash_table_remove的部分代码,有点迷糊,给解释一下:
  1.   c = NEXT_CELL (c, cells, size);
  2.         FOREACH_OCCUPIED_ADJACENT (c, cells, size)                                               
  3.         {
  4.             const void *key2 = c->key;
  5.             struct cell *c_new;

  6.             /* Find the new location for the key. */
  7.             c_new = cells + HASH_POSITION (key2, hasher, size);
  8.             FOREACH_OCCUPIED_ADJACENT (c_new, cells, size)
  9.             if (key2 == c_new->key)
  10.                 /* The cell C (key2) is already where we want it (in
  11.                    C_NEW's "chain" of keys.)  */
  12.                 goto next_rehash;

  13.             *c_new = *c;
  14.             CLEAR_CELL (c);

  15.                         next_rehash:
  16.             ;
  17.         }
复制代码

论坛徽章:
0
239 [报告]
发表于 2011-10-30 07:23 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-30 07:33 编辑

这是个比较初级的hash,因为一个cell只能存储一个key.如果是个链表就能存储相同的。。。。

  1.   c = NEXT_CELL (c, cells, size);
  2.         FOREACH_OCCUPIED_ADJACENT (c, cells, size)                                                
  3.         {
  4.             const void *key2 = c->key;
  5.             struct cell *c_new;

  6.             /* Find the new location for the key. */
  7.             c_new = cells + HASH_POSITION (key2, hasher, size);
  8.             FOREACH_OCCUPIED_ADJACENT (c_new, cells, size)
  9.             if (key2 == c_new->key)
  10.                 /* The cell C (key2) is already where we want it (in
  11.                    C_NEW's "chain" of keys.)  */
  12.                 goto next_rehash;

  13.             *c_new = *c;
  14.             CLEAR_CELL (c);

  15.                         next_rehash:
  16.             ;
  17.         }
复制代码

  1. 首先,这个hashtable 的构造是
  2. 156 struct hash_table {
  3. 157   hashfun_t hash_function;
  4. 158   testfun_t test_function;
  5. 159   
  6. 160   struct cell *cells;          /*这个指针,用来分配一些空间来连续存储 value和key.(key就是要被hashfunction处理的那个值,value是要存储的那个地址*/
  7. 161   int size;                    /*这个size一开始被初始化为1 + items / HASH_MAX_FULLNESS;*/
  8. 162      
  9. 163   int count;                   /*这个是计算这些数组中被占据的单元个数*/
  10. 164   int resize_threshold;        /*如果占据的个数和总个数的比超过0.75,为了保证命中就grow或者resize hashtable*/         
  11. 166   int prime_offset;             /*这个是根据需要来扩展hash 中的cell数目,具体见prime_size()函数和 里面的那个数组是写死的,用来扩展数组。*/
  12. 168 };   
复制代码

  1. 还有在首次创建hast_table中的hash_table_new()函数中。空项被设置为:
  2. 299   memset (ht->cells, INVALID_PTR_CHAR, size * sizeof (struct cell)); /*将所有的空项都设置成了0xff。*/
  3. 原因是key 值为0时可用,为-1表示为空。297   /* Mark cells as empty.  We use 0xff rather than 0 to mark empty
  4. 298      keys because it allows us to use NULL/0 as keys.  */
复制代码

  1. 199 #define FOREACH_OCCUPIED_ADJACENT(c, cells, size)                                   \
  2. /*这里的意思是,它认为如果遇到空项(0xfffffffff)就代表后面没有可用的cell了,
  3. 后面所做的调整也是这个意思,就是如果从“中间”的某个位置删去了一个cell->key,那么得从新hash后面的值,原因如上。. */
  4. 200   for (; CELL_OCCUPIED (c); c = NEXT_CELL (c, cells, size)) /*这是一个for循环的头部*/
  5. 195 #define NEXT_CELL(c, cells, size) (c != cells + (size - 1) ? c + 1 : cells)
  6. /*这个定义,就是说,如果搜寻到最后仍然没有要找的那个cell,就接着从头开始找,你认为这里可能有个bug,就是如果满的话:这里没有可能的,如果你插入的话,就会检查那个
  7. 在hash_table_put()中,会更新这个array的值。
  8. 439   if (ht->count >= ht->resize_threshold)
  9. 440     {
  10. 441       grow_hash_table (ht);
  11. 442       c = find_cell (ht, key);
  12. 443     }

  13. */
复制代码

说完这些,应该就明白了吧。
具体的hash_function就是一些死的东西,没什么新奇的。:wink:

论坛徽章:
0
240 [报告]
发表于 2011-10-30 14:53 |只看该作者
收获颇丰,谢谢版主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP