亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? downloader.py

?? BT的原代碼
?? PY
字號:
# The contents of this file are subject to the BitTorrent Open Source License# Version 1.0 (the License).  You may not copy or use this file, in either# source code or executable form, except in compliance with the License.  You# may obtain a copy of the License at http://www.bittorrent.com/license/.## Software distributed under the License is distributed on an AS IS basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License# for the specific language governing rights and limitations under the# License.# Written by Bram Cohen, Uoti Urpalafrom random import shufflefrom BitTorrent.platform import bttimefrom BitTorrent.CurrentRateMeasure import Measurefrom BitTorrent.bitfield import Bitfieldclass PerIPStats(object):    def __init__(self):        self.numgood = 0        self.bad = {}        self.numconnections = 0        self.lastdownload = None        self.peerid = Noneclass BadDataGuard(object):    def __init__(self, download):        self.download = download        self.ip = download.connection.ip        self.downloader = download.downloader        self.stats = self.downloader.perip[self.ip]        self.lastindex = None    def bad(self, index, bump = False):        self.stats.bad.setdefault(index, 0)        self.stats.bad[index] += 1        if self.ip not in self.downloader.bad_peers:            self.downloader.bad_peers[self.ip] = (False, self.stats)        if self.download is not None:            self.downloader.kick(self.download)            self.download = None        elif len(self.stats.bad) > 1 and self.stats.numconnections == 1 and \             self.stats.lastdownload is not None:            # kick new connection from same IP if previous one sent bad data,            # mainly to give the algorithm time to find other bad pieces            # in case the peer is sending a lot of bad data            self.downloader.kick(self.stats.lastdownload)        if len(self.stats.bad) >= 3 and len(self.stats.bad) > \           self.stats.numgood // 30:            self.downloader.ban(self.ip)        elif bump:            self.downloader.picker.bump(index)    def good(self, index):        # lastindex is a hack to only increase numgood for by one for each good        # piece, however many chunks came from the connection(s) from this IP        if index != self.lastindex:            self.stats.numgood += 1            self.lastindex = indexclass SingleDownload(object):    def __init__(self, downloader, connection):        self.downloader = downloader        self.connection = connection        self.choked = True        self.interested = False        self.active_requests = []        self.measure = Measure(downloader.config['max_rate_period'])        self.peermeasure = Measure(max(downloader.storage.piece_size / 10000,                                       20))        self.have = Bitfield(downloader.numpieces)        self.last = 0        self.example_interest = None        self.backlog = 2        self.guard = BadDataGuard(self)    def _backlog(self):        backlog = 2 + int(4 * self.measure.get_rate() /                          self.downloader.chunksize)        if backlog > 50:            backlog = max(50, int(.075 * backlog))        self.backlog = backlog        return backlog    def disconnected(self):        self.downloader.lost_peer(self)        for i in xrange(len(self.have)):            if self.have[i]:                self.downloader.picker.lost_have(i)        self._letgo()        self.guard.download = None    def _letgo(self):        if not self.active_requests:            return        if self.downloader.storage.endgame:            self.active_requests = []            return        lost = []        for index, begin, length in self.active_requests:            self.downloader.storage.request_lost(index, begin, length)            if index not in lost:                lost.append(index)        self.active_requests = []        ds = [d for d in self.downloader.downloads if not d.choked]        shuffle(ds)        for d in ds:            d._request_more(lost)        for d in self.downloader.downloads:            if d.choked and not d.interested:                for l in lost:                    if d.have[l] and self.downloader.storage.do_I_have_requests(l):                        d.interested = True                        d.connection.send_interested()                        break    def got_choke(self):        if not self.choked:            self.choked = True            self._letgo()    def got_unchoke(self):        if self.choked:            self.choked = False            if self.interested:                self._request_more()    def got_piece(self, index, begin, piece):        try:            self.active_requests.remove((index, begin, len(piece)))        except ValueError:            self.downloader.discarded_bytes += len(piece)            return False        if self.downloader.storage.endgame:            self.downloader.all_requests.remove((index, begin, len(piece)))        self.last = bttime()        self.measure.update_rate(len(piece))        self.downloader.measurefunc(len(piece))        self.downloader.downmeasure.update_rate(len(piece))        if not self.downloader.storage.piece_came_in(index, begin, piece,                                                     self.guard):            if self.downloader.storage.endgame:                while self.downloader.storage.do_I_have_requests(index):                    nb, nl = self.downloader.storage.new_request(index)                    self.downloader.all_requests.append((index, nb, nl))                for d in self.downloader.downloads:                    d.fix_download_endgame()                return False            ds = [d for d in self.downloader.downloads if not d.choked]            shuffle(ds)            for d in ds:                d._request_more([index])            return False        if self.downloader.storage.do_I_have(index):            self.downloader.picker.complete(index)        if self.downloader.storage.endgame:            for d in self.downloader.downloads:                if d is not self and d.interested:                    if d.choked:                        d.fix_download_endgame()                    else:                        try:                            d.active_requests.remove((index, begin, len(piece)))                        except ValueError:                            continue                        d.connection.send_cancel(index, begin, len(piece))                        d.fix_download_endgame()        self._request_more()        if self.downloader.picker.am_I_complete():            for d in [i for i in self.downloader.downloads if i.have.numfalse == 0]:                d.connection.close()        return self.downloader.storage.do_I_have(index)    def _want(self, index):        return self.have[index] and self.downloader.storage.do_I_have_requests(index)    def _request_more(self, indices = None):        assert not self.choked        if len(self.active_requests) >= self._backlog():            return        if self.downloader.storage.endgame:            self.fix_download_endgame()            return        lost_interests = []        while len(self.active_requests) < self.backlog:            if indices is None:                interest = self.downloader.picker.next(self._want, self.have.numfalse == 0)            else:                interest = None                for i in indices:                    if self.have[i] and self.downloader.storage.do_I_have_requests(i):                        interest = i                        break            if interest is None:                break            if not self.interested:                self.interested = True                self.connection.send_interested()            self.example_interest = interest            self.downloader.picker.requested(interest, self.have.numfalse == 0)            while len(self.active_requests) < (self.backlog-2) * 5 + 2:                begin, length = self.downloader.storage.new_request(interest)                self.active_requests.append((interest, begin, length))                self.connection.send_request(interest, begin, length)                if not self.downloader.storage.do_I_have_requests(interest):                    lost_interests.append(interest)                    break        if not self.active_requests and self.interested:            self.interested = False            self.connection.send_not_interested()        if lost_interests:            for d in self.downloader.downloads:                if d.active_requests or not d.interested:                    continue                if d.example_interest is not None and self.downloader.storage.do_I_have_requests(d.example_interest):                    continue                for lost in lost_interests:                    if d.have[lost]:                        break                else:                    continue                interest = self.downloader.picker.next(d._want, d.have.numfalse == 0)                if interest is None:                    d.interested = False                    d.connection.send_not_interested()                else:                    d.example_interest = interest        if self.downloader.storage.endgame:            self.downloader.all_requests = []            for d in self.downloader.downloads:                self.downloader.all_requests.extend(d.active_requests)            for d in self.downloader.downloads:                d.fix_download_endgame()    def fix_download_endgame(self):        want = [a for a in self.downloader.all_requests if self.have[a[0]] and a not in self.active_requests]        if self.interested and not self.active_requests and not want:            self.interested = False            self.connection.send_not_interested()            return        if not self.interested and want:            self.interested = True            self.connection.send_interested()        if self.choked or len(self.active_requests) >= self._backlog():            return        shuffle(want)        del want[self.backlog - len(self.active_requests):]        self.active_requests.extend(want)        for piece, begin, length in want:            self.connection.send_request(piece, begin, length)    def got_have(self, index):        if self.have[index]:            return        if index == self.downloader.numpieces-1:            self.peermeasure.update_rate(self.downloader.storage.total_length-              (self.downloader.numpieces-1)*self.downloader.storage.piece_size)        else:            self.peermeasure.update_rate(self.downloader.storage.piece_size)        self.have[index] = True        self.downloader.picker.got_have(index)        if self.downloader.picker.am_I_complete() and self.have.numfalse == 0:            self.connection.close()            return        if self.downloader.storage.endgame:            self.fix_download_endgame()        elif self.downloader.storage.do_I_have_requests(index):            if not self.choked:                self._request_more([index])            else:                if not self.interested:                    self.interested = True                    self.connection.send_interested()    def got_have_bitfield(self, have):        if self.downloader.picker.am_I_complete() and have.numfalse == 0:            self.connection.close()            return        self.have = have        for i in xrange(len(self.have)):            if self.have[i]:                self.downloader.picker.got_have(i)        if self.downloader.storage.endgame:            for piece, begin, length in self.downloader.all_requests:                if self.have[piece]:                    self.interested = True                    self.connection.send_interested()                    return        for i in xrange(len(self.have)):            if self.have[i] and self.downloader.storage.do_I_have_requests(i):                self.interested = True                self.connection.send_interested()                return    def get_rate(self):        return self.measure.get_rate()    def is_snubbed(self):        return bttime() - self.last > self.downloader.snub_timeclass Downloader(object):    def __init__(self, config, storage, picker, numpieces, downmeasure,                 measurefunc, kickfunc, banfunc):        self.config = config        self.storage = storage        self.picker = picker        self.chunksize = config['download_slice_size']        self.downmeasure = downmeasure        self.numpieces = numpieces        self.snub_time = config['snub_time']        self.measurefunc = measurefunc        self.kickfunc = kickfunc        self.banfunc = banfunc        self.downloads = []        self.perip = {}        self.bad_peers = {}        self.discarded_bytes = 0    def make_download(self, connection):        ip = connection.ip        perip = self.perip.get(ip)        if perip is None:            perip = PerIPStats()            self.perip[ip] = perip        perip.numconnections += 1        d = SingleDownload(self, connection)        perip.lastdownload = d        perip.peerid = connection.id        self.downloads.append(d)        return d    def lost_peer(self, download):        self.downloads.remove(download)        ip = download.connection.ip        self.perip[ip].numconnections -= 1        if self.perip[ip].lastdownload == download:            self.perip[ip].lastdownload = None    def kick(self, download):        if not self.config['retaliate_to_garbled_data']:            return        ip = download.connection.ip        peerid = download.connection.id        # kickfunc will schedule connection.close() to be executed later; we        # might now be inside RawServer event loop with events from that        # connection already queued, and trying to handle them after doing        # close() now could cause problems.        self.kickfunc(download.connection)    def ban(self, ip):        if not self.config['retaliate_to_garbled_data']:            return        self.banfunc(ip)        self.bad_peers[ip] = (True, self.perip[ip])

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产区在线观看成人精品| 欧美美女黄视频| 国产精品久久综合| 91麻豆精品在线观看| 亚洲主播在线播放| 欧美精品久久天天躁| 老司机免费视频一区二区| 国产亚洲成aⅴ人片在线观看 | 国产精品一区二区久久精品爱涩| 欧美mv日韩mv国产网站| 国产精品一区二区果冻传媒| 亚洲视频综合在线| 欧美精品在线视频| 韩国精品一区二区| 亚洲桃色在线一区| 日韩视频免费观看高清完整版在线观看 | 亚洲图片欧美综合| 精品乱人伦小说| 99精品国产视频| 免费不卡在线观看| 日韩伦理av电影| 欧美色涩在线第一页| 狠狠色丁香久久婷婷综合丁香| 国产精品人成在线观看免费 | 亚洲国产精品成人综合 | 1000精品久久久久久久久| 欧美日韩视频在线一区二区| 国产一区在线视频| 一二三四社区欧美黄| 久久久久9999亚洲精品| 欧美性高清videossexo| 国产乱码精品一区二区三区av| 一区二区三区四区中文字幕| 久久综合久色欧美综合狠狠| 91麻豆视频网站| 国产一区二区三区久久久| 亚洲午夜日本在线观看| 国产精品拍天天在线| 精品99一区二区| 欧美亚洲日本国产| 成人丝袜高跟foot| 蜜臀国产一区二区三区在线播放| 亚洲图片激情小说| 欧美va在线播放| 欧美福利视频导航| 一本大道综合伊人精品热热 | 亚洲欧美激情插| 久久精品一区八戒影视| 欧美日韩一卡二卡三卡| 99精品视频在线播放观看| 精品一区二区三区免费毛片爱| 一区二区三区精品视频在线| 国产精品理论在线观看| 久久九九影视网| 精品久久久久久综合日本欧美| 欧美精选一区二区| 欧美色手机在线观看| 91小宝寻花一区二区三区| 成人av集中营| 成人性生交大片免费看中文| 国产在线不卡一区| 激情综合一区二区三区| 青青草97国产精品免费观看 | 在线电影一区二区三区| 色哟哟国产精品免费观看| 成人av中文字幕| 成人动漫av在线| 国产91综合网| 风间由美一区二区三区在线观看 | 国产精品一区一区| 国产精品正在播放| 国产二区国产一区在线观看| 久久国产精品99精品国产| 日韩电影在线免费观看| 全国精品久久少妇| 蜜桃一区二区三区在线观看| 青青草精品视频| 久久99国产精品久久99| 国产一区二区三区av电影| 国产麻豆精品在线| 成人性生交大片免费 | 色屁屁一区二区| 在线视频一区二区三| 欧美日韩专区在线| 91精品久久久久久久久99蜜臂| 制服丝袜亚洲播放| 欧美成人精品3d动漫h| 欧美mv日韩mv国产网站app| 久久久亚洲午夜电影| 国产日韩亚洲欧美综合| 中文字幕在线一区二区三区| 一区二区三区在线视频播放| 偷拍日韩校园综合在线| 美国十次综合导航| 国产69精品久久久久777| 99久久伊人精品| 欧美日韩国产中文| ww久久中文字幕| 最好看的中文字幕久久| 五月天中文字幕一区二区| 激情图区综合网| 99国产精品久久久久久久久久久| 欧美在线小视频| 日韩免费观看高清完整版| 国产日韩欧美精品电影三级在线| 成人欧美一区二区三区黑人麻豆| 伊人性伊人情综合网| 美女脱光内衣内裤视频久久网站| 国产盗摄一区二区三区| 精品视频一区 二区 三区| 久久免费偷拍视频| 亚洲影视资源网| 国产在线视频不卡二| 色诱视频网站一区| 欧美草草影院在线视频| 亚洲视频在线一区| 久国产精品韩国三级视频| 99国产精品久久久久久久久久久| 欧美一级专区免费大片| 136国产福利精品导航| 秋霞电影一区二区| gogo大胆日本视频一区| 日韩女优电影在线观看| 亚洲免费在线电影| 精品亚洲porn| 欧美日韩国产影片| 欧美国产精品专区| 久久综合综合久久综合| 在线一区二区视频| 国产午夜精品久久久久久免费视| 亚洲国产精品精华液网站| 大桥未久av一区二区三区中文| 欧美综合一区二区三区| 国产精品久久精品日日| 国产伦精品一区二区三区视频青涩 | 久久免费电影网| 视频一区二区三区在线| 99国产精品国产精品久久| 久久久久一区二区三区四区| 亚洲一级电影视频| 91免费版在线| 欧美国产一区二区| 国产呦萝稀缺另类资源| 日韩欧美激情在线| 日韩成人av影视| 欧美三级电影在线观看| 亚洲精品少妇30p| 91原创在线视频| 国产精品传媒在线| 国产成人精品亚洲日本在线桃色 | 国产精品视频免费看| 国模套图日韩精品一区二区| 欧美一区二区三区色| 久久se精品一区二区| 欧美体内she精视频| 亚洲欧美色图小说| 99久久精品免费看国产免费软件| 日本一区二区三级电影在线观看| 国产一区不卡视频| 久久久国产精品不卡| 极品销魂美女一区二区三区| 欧美mv日韩mv国产网站app| 久久电影网电视剧免费观看| 日韩欧美国产综合| 麻豆成人在线观看| 欧美电视剧在线看免费| 久久www免费人成看片高清| 精品福利二区三区| 极品美女销魂一区二区三区免费| 26uuu另类欧美亚洲曰本| 国产毛片精品一区| 国产精品美女久久久久aⅴ | 日本一区二区三区在线观看| 国产精品99久久久久久久女警 | 成人永久看片免费视频天堂| 国产亚洲va综合人人澡精品| 成人丝袜18视频在线观看| 中文字幕一区在线观看视频| 91麻豆成人久久精品二区三区| 一区二区三区日韩欧美| 欧美肥妇毛茸茸| 激情偷乱视频一区二区三区| 国产视频一区二区在线| 91视频观看视频| 亚洲一区二区视频| 日韩无一区二区| 国产成人午夜99999| 亚洲视频精选在线| 欧美日韩你懂得| 国产自产v一区二区三区c| 国产精品久久久久久久久免费樱桃| 99精品视频在线观看| 日日噜噜夜夜狠狠视频欧美人| 精品美女在线播放| a美女胸又www黄视频久久| 亚洲成人动漫在线免费观看| 日韩免费高清av| 不卡av在线免费观看| 青青草成人在线观看| 国产精品久久网站|