摘要:原文地址: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......