Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121996
  • 博文数量: 14
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-06 00:42
文章分类
文章存档

2011年(1)

2008年(13)

我的朋友

分类: C/C++

2008-03-09 19:41:08

分析BT源代码的第一步:实现提取种子文件里的信息。
 
int btContent::InitialFromMI(const char *metainfo_fname,const char *saveas)    //此函数读取种子文件包含的信息,其中包含的主要函数如下:
 {
      b = _file2mem(metainfo_fname,&flen); //将种子文件信息读入内存区域b中,metainfo_fname为文件名,flen存放种子文件的长度。
    {   关于流的打开函数:
          
       #include   
         FILE *fopen(const char *pathname,const char *type);
      // pathname表示文件名,type表示流的打开方式,如:"r"表可读,"w"表可写
         分配内存空间所使用的函数:
 
         #include
          void *malloc(size_t size)
         读取文件信息函数:
 fread(b, sb.st_size, 1, fp)//读取的文件放在了*b中
     }
    
      宏函数:meta_str(), meta_int(), meta_pos()
          这三个函数是函数decode_query()的变体,提供种子文件的解码。也是分析源代码最重要的三个函数,概括一点说,就是找到种子文件中的一些“关键字”(announce, info, creation date等),再将描述关键字的值提取出来。三个函数宏定义如下:
#define meta_str(keylist,pstr,pint) decode_query(b,flen,(keylist),(pstr),(pint),(int64_t*) 0,QUERY_STR)
#define meta_int(keylist,pint) decode_query(b,flen,(keylist),(const char**) 0,(pint),(int64_t*) 0,QUERY_INT)

#define meta_pos(keylist) decode_query(b,flen,(keylist),(const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_POS)


  const char * s, size_t r

     将种子文件的announce URL放入内存sannounce URL的值赋给r
  (2) r = meta_pos("info") ,返回种子文件中位于”infor”字符串后面一位的字符的位置。
  (3) meta_int("creation date",&r),提取种子文件中”creation date”数值到r
 
   q = decode_dict(b + r, flen - r, (char *) 0)); //解析info这个dictonary
 
   Sha1(b + r, q, m_shake_buffer + 28);
   //info这个dictonarySHA1 Hash值(从’d’’e’)放入m_shake_buffer中。

    

设置m_shake_buffer

位数

0

1……………….19

20….27

28………….47

48……55

56….67

填充

19

BitTorrent protocol

0

20HASH

-CD0102-

随机数

      

      memcpy(m_hash_table, s, m_hashtable_length);

 //将种子文件中的哈希表填充入m_hash_table,与tracker服务器通信时会发送m_hash_table的内容以便让tracker服务器辨别客户端是否在使用服务器端已有的并且正确的种子文件。

    
 
 
 
阅读(3389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~