终于抽出时间来进行 BITTORRENT的学习了
BT想必大家都很熟悉了,是一种文件分发协议。每个下载者在下载的同时也在向其他下载者分享文件。
相对于FTP HTTP协议,BT并不是从某一个或者几个指定的点进行文件下载,而是用户之间进行交互,每个用户既是下载者也是上传者.
BT并不会出现提供下载的服务点出现问题而无法下载的现象。
我尝试从BT文件开始下载的流程来分析下我们需要那些功能。
首先我们从某网站下载BT种子文件,文件很小,记录要下载的实际文件的一些信息。
那么我们就需要从该BT种子文件解析出 文件的数量(比如视频文件和文件字幕等多个文件),文件名称,文件大小,还有最重要的连接何处网站获取其他用户信息等等等等。
这个就是种子解析模块。
Tracker服务器会记录在下载该文件的ip和端口,我们连接上去就可以从其他用户peer下载文件了,同时Tracker服务器也会记录我们自己的IP和端口,为其他peer分享文件。
这个是连接Tracker模块。
我们与其他peer进行连接,交换文件数据。就是peer交换数据模块。
主体就是这些。那么在实际运行中,会有一些细节需要解决,衍生出次级模块。
比如我们要知道其他peer下载的文件内容进度和提供我们下载文件的内容进度,这就需要bitmap管理模块。
为了防止有的peer之下载不上传,就需要添加一个策略管理,鼓励所有peer踊跃分享文件。
我们不可能每下一点点文件内容就马上写入磁盘,这样效率太低,所以也需要缓冲管理模块。
以及整个流程中消息的流转和管理的,消息管理模块。
结构图如下:
今天看看种子文件解析代码.bt种子文件使用B编码。如图
了解了字符串 数字 列表和字典后,看看一个实际的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] = '