免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2752 | 回复: 0
打印 上一主题 下一主题

libtorrent分析随笔——它是如何处理bitfield的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-22 09:14 |只看该作者 |倒序浏览

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个功能,就是位为真的统计(可以用计数器实现),其次是所有位为真时释放占用的内存)。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/36381/showart_326207.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP