终于抽出时间来进行 BITTORRENT的学习了

BT想必大家都很熟悉了,是一种文件分发协议。每个下载者在下载的同时也在向其他下载者分享文件。

相对于FTP HTTP协议,BT并不是从某一个或者几个指定的点进行文件下载,而是用户之间进行交互,每个用户既是下载者也是上传者.

BT并不会出现提供下载的服务点出现问题而无法下载的现象。

我尝试从BT文件开始下载的流程来分析下我们需要那些功能。

首先我们从某网站下载BT种子文件,文件很小,记录要下载的实际文件的一些信息。

那么我们就需要从该BT种子文件解析出 文件的数量(比如视频文件和文件字幕等多个文件),文件名称,文件大小,还有最重要的连接何处网站获取其他用户信息等等等等。

这个就是种子解析模块。

Tracker服务器会记录在下载该文件的ip和端口,我们连接上去就可以从其他用户peer下载文件了,同时Tracker服务器也会记录我们自己的IP和端口,为其他peer分享文件。

这个是连接Tracker模块。

我们与其他peer进行连接,交换文件数据。就是peer交换数据模块。

主体就是这些。那么在实际运行中,会有一些细节需要解决,衍生出次级模块。

比如我们要知道其他peer下载的文件内容进度和提供我们下载文件的内容进度,这就需要bitmap管理模块。

为了防止有的peer之下载不上传,就需要添加一个策略管理,鼓励所有peer踊跃分享文件。

我们不可能每下一点点文件内容就马上写入磁盘,这样效率太低,所以也需要缓冲管理模块。

以及整个流程中消息的流转和管理的,消息管理模块。

结构图如下:

bittorrent 学习(一) 种子文件分析与bitmap位图

 

今天看看种子文件解析代码.bt种子文件使用B编码。如图

bittorrent 学习(一) 种子文件分析与bitmap位图

 了解了字符串 数字 列表和字典后,看看一个实际的BT文件

最开始的就是 d8:announce  41:http://tracker.trackerfix.com:80/announce

13:announce-list

l

  l

  41:http://tracker.trackerfix.com:80/announce

  e

  l

  30:udp://9.rarbg.to:2710/announce

  e

  。。。。。。。

e

字典有两个 映射  一个key value是 announce  和 http://tracker.trackerfix.com:80/announce

一个key value 是 announce-list 对应一组列表  列表是 http://tracker.trackerfix.com:80/announce   udp://9.rarbg.to:2710/announce 等等

announce-list 中包含了 announce项目下的tracker服务器IP和端口 所以代码中只需要搜索其中一个关键字即可

 1 int read_announce_list()
 2 {
 3     Announce_list  *node = NULL;
 4     Announce_list  *p    = NULL;
 5     int            len   = 0;
 6     long           i;
 7 
 8     if( find_keyword("13:announce-list",&i) == 0 ) {
 9         if( find_keyword("8:announce",&i) == 1 ) {
10             i = i + strlen("8:announce");
11             while( isdigit(metafile_content[i]) ) {
12                 len = len * 10 + (metafile_content[i] - '0');
13                 i++;
14             }
15             i++;  // 跳过 ':'
16 
17             node = (Announce_list *)malloc(sizeof(Announce_list));
18             strncpy(node->announce,&metafile_content[i],len);
19             node->announce[len] = '\0';
20             node->next = NULL;
21             announce_list_head = node;
22         }
23     } 
24     else {  // 如果有13:announce-list关键词就不用处理8:announce关键词
25         i = i + strlen("13:announce-list");
26         i++;         // skip 'l'
27         while(metafile_content[i] != 'e') {
28             i++;     // skip 'l'
29             while( isdigit(metafile_content[i]) ) {
30                 len = len * 10 + (metafile_content[i] - '0');
31                 i++;
32             }
33             if( metafile_content[i] == ':' )  i++;
34             else  return -1;
35 
36             // 只处理以http开头的tracker地址,不处理以udp开头的地址
37             if( memcmp(&metafile_content[i],"http",4) == 0 ) {
38                 node = (Announce_list *)malloc(sizeof(Announce_list));
39                 strncpy(node->announce,&metafile_content[i],len);
40                 node->announce[len] = '\0';
41                 node->next = NULL;
42 
43                 if(announce_list_head == NULL)
44                     announce_list_head = node;
45                 else {
46                     p = announce_list_head;
47                     while( p->next != NULL) p = p->next; // 使p指向最后个结点
48                     p->next = node; // node成为tracker列表的最后一个结点
49                 }
50             }
51 
52             i = i + len;
53             len = 0;
54             i++;    // skip 'e'
55             if(i >= filesize)  return -1;
56         }    
57     }
58 
59 #ifdef DEBUG
60     p = announce_list_head;
61     while(p != NULL) {
62         printf("%s\n",p->announce);
63         p = p->next;
64     }
65 #endif    
66     
67     return 0;
68 }
View Code

相关文章:

  • 2021-09-06
  • 2022-03-02
  • 2021-08-01
  • 2021-08-23
  • 2021-10-15
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-29
  • 2022-01-07
  • 2021-12-10
  • 2021-06-16
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案