分析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放入内存s,announce 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这个dictonary的SHA1 Hash值(从’d’到’e’)放入m_shake_buffer中。
设置m_shake_buffer
位数 |
0 |
1……………….19 |
20….27 |
28………….47 |
48……55 |
56….67 |
填充 |
19 |
BitTorrent protocol |
0 |
20位HASH值 |
-CD0102- |
随机数 |
memcpy(m_hash_table, s, m_hashtable_length);
//将种子文件中的哈希表填充入m_hash_table,与tracker服务器通信时会发送m_hash_table的内容以便让tracker服务器辨别客户端是否在使用服务器端已有的并且正确的种子文件。
阅读(3413) | 评论(0) | 转发(0) |