当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 客户端源码分析之三: StorageWrapper 类
 

 

 ·浮想b/s中的防御    »显示摘要«
    摘要:原文地址:http://blog.csdn.net/estyle/archive/2004/07/02/32269.aspx欢迎转载!但请注明出处(原文地址)和我的姓名:靳田谢谢啦! ^_^   尽管大家都提“防御性编程”,但我还是比较喜欢“防御”——毕竟防御不是目的,只是措施而已,过分强调难免迷失方向。   首先要弄清楚的问题是:什么是防御?为什么要进行防御?  回答第一个问题,简单地说,防......
    摘要:第九章 方法 一、 实例构造器 1、 前面提到用new操作符创建对象时的三部曲: l 为对象分配内存 l 初始化对象的附加成员(方法表指针和syncblockindex) l 调用实例构造器初始化实例状态 在分配内存时,系统将所有内存位置均置为0值,这就是为什么字段初始化而未赋值时均为0或null值。 不调用实例构造器的情况: l 调用object.memberwiseclone()方法创建实例(......


客户端源码分析之三: StorageWrapper 类
客户端源码分析之三: storagewrapper 类

作者:小马哥 【程序编程相关:Web开发技术史话

  【推荐阅读:在 Linux 下直接使用 ISO 映像

  【扩展信息:实现上千万条数据的分页显示!

日期:2004-6-30

storagewrapper 的作用:把文件片断进一步切割为子片断,并且为这些子片断发送 request消息.在获得子片断后,将数据写入磁盘.

请结合 storage 类的分析来看.

 

几点说明:

1.  为了获取传输性能,bt把文件片断切割为多个子片断.

2.  bt为获取一个子片断,需要向拥有该子片断的peer发送request消息(关于 request消息,参见«bt协议规范»).

3. 例如一个256k大小的片断,索引号是10,被划分为16个16k大小的子片断.那么需要为这16个子片断分别产生一个 request 消息.这些request消息在发出之前,以list的形式保存在 inactive_requests 这个list中.例如对这个片断,就保存在inactive_requests下标为 10(片断的索引号)的地方,值是如下的 list:[(0,16k),(16k, 16k), (32k, 16k), (48k, 16k), (64k, 16k), (80k, 16k), (96k, 16k), (112k, 16k), (128k, 16k), (144k, 16k), (160k, 16k), (176k, 16k), (192k, 16k), (208k, 16k), (224k, 16k), (240k, 16k)].这个处理过程在 _make_inactive() 函数中.因为这些request还没有发送出去,所以叫做 inactive request(未激活的请求).如果一个 request 发送出去了,那么叫做 active request.为每个片断已经发送出去的request个数记录在 numactive 中.如果收到一个子片断,那么 active request 个数就要减1.amount_inactive 记录了尚没有发出request的子片断总的大小.

4. 每当获得一个子片段,都要写入磁盘.如果子片断所属的片断在磁盘上还没有分配空间,那么首先需要为整个片断分配空间.如何为片断分配空间?这正是 storagewrapper 类中最难理解的一部分代码.这个“空间分配算法”说起来很简单,但是在没有任何注释的情况下去看代码,耗费了我好几天的时间.具体的算法分析,请看 _piece_came_in() 的注释.

 

 

class storagewrapper:

def __init__(self, storage, request_size, hashes,

            piece_size, finished, failed,

            statusfunc = dummy_status, flag = event(), check_hashes = true,

data_flunked = dummy_data_flunked):

 

        self.storage = storage              # storage 对象

        self.request_size = request_size #子片断大小

        self.hashes = hashes        # 文件片断摘要信息

        self.piece_size = piece_size  # 片断大小

        self.data_flunked = data_flunked        # 一个函数,用来检查片断的完整性

        self.total_length = storage.get_total_length()         # 文件总大小

        self.amount_left = self.total_length        # 未下载完的文件大小

       

              # 文件总大小的有效性检查

              # 因为最后一个片断长度可能小于 piece_size

        if self.total_length <= piece_size * (len(hashes) - 1):

            raise valueerror, ´bad data from tracker - total too small´

        if self.total_length > piece_size * len(hashes):

            raise valueerror, ´bad data from tracker - total too big´

 

        # 两个事件,分布在下载完成与下载失败的时候设置

        self.finished = finished


...   下一页
    摘要:假设我是搭建在内部局域网中的一个dns(仅用测试嘛~)。 1. 第一步肯定是要规划一下自己域内的dns该怎么配! 希望配置到my.net的主域名服务器为10.1.1.198。而marco.my.net是公司的web和ftp服务器,它的ip是10.1.1.201。yuyu.my.net是mail server指向10.1.1.202 2. 根据上面的想法配置/etc/named.conf optio......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE