Rasterbar Libtorrent 的简单分析

来源:互联网 发布:京瓷扫描仪软件 编辑:程序博客网 时间:2024/05/17 02:00

  最近在做的一个P2P项目需要使用到一些基础的IO,网络通信的模块,自己写的话短时间内很难达到产品级的健壮性,所以就从现有的开源项目里面抽取模块了,看了看eMule的,这东西和MFC结合紧密,而且整个项目大的可怕,要编译成功都很麻烦,更不要说去抽取它的模块了。不大靠谱。于是就研究了一下LibTorrent,不过这东西有两个。我研究的是Rasterbar的版本。现在的版本是0.15.0。不过这东西整了个openssl的功能。openssl在windows下编译麻烦死了,关键还得装个perl还是python忘了,代码也复杂了。所以我花了点时间把openssl给剥离出去。还好作者写的代码思路清晰,都用宏定义划分了不同功能的分支。

 

 

  libtorrent的类结构中最大的一个结构就是alert结构了(点击看大图).

 

 

alert

 

libtorrent的alert类结构

  对于外部程序来说,libtorrent的pop_alert()函数正是外部程序用来从libtorrent中获取各种消息、警告、错误等信息的接口。按照官方文档的说明,如果没有任何可用的这些信息的话,就自动返回一个默认构造的auto_ptr对象。由此可见。这个alert的继承树中的各种具体的对象,就分别代表了不同的信息了。对于libtorrent来说,它内部维护了一个alert的队列。此外,libtorrent默认是只保存错误消息的。可以使用set_alert_mask来设置。当然,获得了一个auto_ptr对象的话自然还必须知道具体是哪一个,所以libtorrent就使用alert_cast<>来获得具体的详细类型。alert的具体类型都定义在libtorrent/alert_types.hpp文件中。

  alert的代码是这样的:

 


 

   关于每个alert的具体描述,官方文档这里有说明。

 

 

 


 

 

libtorrent_exception

 

  libtorrent中的不少函数有两个版本,一个会抛出异常,一个是接受一个引用,返回异常代码。因为直接使用了boost的error code来表示错误,所以结构比较简单。

 

 


 

 

storage_interface

  storage_interface是libtorrent中我最关心的一部分了,这个接口是个纯虚函数,目的是可以让开发者定制特定的种子对应的文件保存位置,默认使用一个代表存储在本地磁盘的文件的实现。storage_interface是基于槽实现的,每个槽有piece_size个字节。所有对磁盘的读写都是基于完整的或者部分的槽。

 

 

 

 

 

  文件是分片了,但是关于文件分片在程序中的读取优先级,则主要在torrent_handle中处理


torrent_handle

 

torrent_handle中对文件下载顺序影响最大的一个函数就是set_piece_deadline()函数了,这个函数给每个片段设置一个截止期限,libtorrent会在截止期限终止之前去尝试下载这个片段.而piece_priority() prioritize_pieces() piece_priorities()则设置了每个片段的优先级(注意是和其available有关的).