⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localdiscovery.py

📁 bittorrent source by python. please enjoy
💻 PY
字号:
# Zeroconf discovery of other BT clients on the local network.## by Greg Hazelimport sysimport randomimport socketimport loggingimport Zeroconffrom BitTorrent.HostIP import get_deferred_host_ip, get_host_ipdiscovery_logger = logging.getLogger('LocalDiscovery')discovery_logger.setLevel(logging.DEBUG)#discovery_logger.addHandler(logging.StreamHandler(sys.stdout))server = Nonedef _get_server():    global server    if not server:        server = Zeroconf.Zeroconf()    return serverclass LocalDiscovery(object):    def __init__(self, rawserver, port, got_peer):        self.rawserver = rawserver        self.port = port        self.got_peer = got_peer        self.server = _get_server()        self.services = []    def announce(self, infohash, peerid):        discovery_logger.info("announcing: %s", infohash)        service_name = "_BitTorrent-%s._tcp.local." % infohash                # do I need to keep the browser around?        browser = Zeroconf.ServiceBrowser(self.server, service_name, self)        df = get_deferred_host_ip()        df.addCallback(self._announce2, peerid, service_name)        return df    def _announce2(self, ip, peerid, service_name):        addr = socket.inet_aton(ip)        service = Zeroconf.ServiceInfo(service_name,                                       '%s.%s' % (peerid, service_name),                                       address = addr,                                       port = self.port,                                       weight = 0, priority = 0,                                       properties = {}                                      )        self.server.registerService(service)        self.services.append(service)    def addService(self, server, type, name):        discovery_logger.info("Service %s added", repr(name))        # Request more information about the service        info = server.getServiceInfo(type, name)        if info and info.address is not None:            host = socket.inet_ntoa(info.address)            try:                port = int(info.port)            except:                discovery_logger.exception("Invalid Service (port not an int): "                                           "%r" % info.__dict__)                return            addr = (host, port)            ip = get_host_ip()            if addr == (ip, self.port):                # talking to self                return            infohash = name.split("_BitTorrent-")[1][:-len("._tcp.local.")]            discovery_logger.info("Got peer: %s:%d %s", host, port, infohash)            # BUG: BitTorrent is so broken!            t = random.random() * 3            self.rawserver.external_add_task(t, self._got_peer, addr, infohash)    def removeService(self, server, type, name):        discovery_logger.info("Service %s removed", repr(name))    def _got_peer(self, addr, infohash):        if self.got_peer:            self.got_peer(addr, infohash)                def stop(self):        self.port = None        self.got_peer = None        for service in self.services:            self.server.unregisterService(service)        del self.services[:]        if __name__ == '__main__':    import string    import threading    from BitTorrent.RawServer_twisted import RawServer    rawserver = RawServer()    def run_task_and_exit():        l = LocalDiscovery(rawserver, 6881,                           lambda *a:sys.stdout.write("GOT: %s\n" % str(a)))        l.announce("63f27f5023d7e49840ce89fc1ff988336c514b64",                   ''.join(random.sample(string.letters, 5)))        rawserver.add_task(0, run_task_and_exit)    rawserver.listen_forever()             

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -