Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167889
  • 博文数量: 36
  • 博客积分: 1466
  • 博客等级: 上尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-17 17:43
文章分类

全部博文(36)

分类: 系统运维

2007-06-22 09:14:02

libtorrent分析随笔——它是如何处理bitfield的
作者:writer15     mail:writer15(at)163.com
转载请注明原作者名称,联系方法和出处

很好奇想知道libtorrent是如何处理bitfield的,因为我发现不论是std::vector还是boost::dynamic_bitset<>都满足不了bittorrent的所有需求。(其实boost::dynamic_bitset<>已经满足了大部份的,但是因为它的字节顺序和位顺序跟bittorrent定义有所不同,而且也没有办法改变)

bt_peer_connection.cpp的on_bitfield(...)函数的作用是处理bitfield消息的。在它的实现代码中可以看到声明了一个std::vector bitfield,接收数据后用一个for循环测试所有的位,并赋值给bitfield。

在看看write_bitfield(...)函数,它的作用就是向peer发送bitfield消息。在它的补码代码中同样可以看到是用std::vector来代表一个bitfield,但在发送前进行了位顺序转换。

使用std::vector来实现bitfield有优点也有缺点,优点当然是不用自己实现,省了不少开发时间,而且也十常可靠。但缺点也是不少的,因为每一次握手都要进行2次位顺序的转换,当在比较极端的情况下(piece数很多,任务刚开始且和大量peer进行握手的时候)占用CPU估计是非常高的。而且不能够对std::vector占用的内存不能很灵活的控制,不像bittorrent的源代码一样,当所有位为真是,它就free掉占用的内存。

还有我发现一个问题,就是不方便计算一个peer的完成百分比。因为返回peer信息的peer_info结构同样是用std::vector保存peer的bitfield的。因为std::vector没有统计功能,所以只能用count_if()算法来实现,但是这样每次刷新peer信息的时候都要进行很多次循环,当peer数比较多,piece数又很大的时候,想像下CPU占用率吧……

所以我认为自己写一个bitfield类非常重要,它比起std::vector 起码要加2个功能,就是位为真的统计(可以用计数器实现),其次是所有位为真时释放占用的内存)。

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