当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 客户端源码分析之三: 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 类
上一页   ...         self.failed = failed

              【程序编程相关:Web开发技术史话

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

        self.numactive = [0] * len(hashes) 【扩展信息:实现上千万条数据的分页显示!

这几个变量的作用在前面已经介绍过了.

              inactive_request

inactive_requests 的值全部被初始化为1,这表示每个片断都需要发送 request.后面在对磁盘文件检查之后,那些已经获得的片断,在 inactive_requests中对应的是 none,表示不需要再为这些片断发送 request了.

        self.inactive_requests = [1] * len(hashes)

        self.amount_inactive = self.total_length

 

# 是否进入 endgame 模式?关于 endgame 模式,在«incentives build robustness in bittorrent »的“片断选择算法”中有介绍.后面可以看到,在为最后一个“子片断”产生请求后,进入 endgame 模式.

        self.endgame = false 

       

        self.have = bitfield(len(hashes))

        # 该片是否检查了完整性

        self.waschecked = [check_hashes] * len(hashes)

       

这两个变量用于“空间分配算法”

        self.places = { }

        self.holes = [ ]

 

        if len(hashes) == 0:

            finished()

            return

 

        targets = {}

        total = len(hashes)

 

# 检查每一个片断,,,

        for i in xrange(len(hashes)):

 

# 如果磁盘上,还没有完全为这个片断分配空间,那么这个片断需要被下载,在 targets 字典中添加一项(如果已经存在,就不用添加了),它的关键字(key)是该片断的摘要值,它的值(value)是一个列表, 这个片断的索引号被添加到这个列表中.

这里一度让我非常迷惑,因为一直以为不同的文件片断肯定具有不同的摘要值.后来才想明白了,那就是:两个不同的文件片断,可能拥有相同的摘要值.不是么?只要这两个片断的内容是一样的.

这一点,对后面的分析非常重要.

 

if not self._waspre(i):

                     targets.setdefault(hashes[i], []).append(i)

                total -= 1

 

        numchecked = 0.0

        if total and check_hashes:

            statusfunc({"activity" : ´checking existing file´, "fractiondone" : 0})

 

 

 

# 这是一个内嵌在函数中的函数.在 c++ 中,可以有内部类,不过好像没有内部函数的说法.这个函数只能在 __init__() 内部使用.

这个函数在一个片段被确认获得后调用

# piece: 片断的索引号

# pos: 这个片断在磁盘上存储的位置

例如,片断5可能存储在片断2的位置上.请参看后面的“空间分配算法”

 

        def markgot(piece, pos, self = self, check_hashes = check_hashes):

            self.places[piece] = pos


...   下一页
    摘要:假设我是搭建在内部局域网中的一个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