def getPeersReceived(self, res, address): """ 回应get_peers请求, 差不多跟findNodeReceived一样, 只回复nodes. 懒得维护peer信息 """ try: infohash = res["a"]["info_hash"] closeNodes = self.table.findCloseNodes(infohash, 16) if not closeNodes: return nid = res["a"]["id"] h = sha1() h.update(infohash + nid) token = h.hexdigest()[:TOKEN_LENGTH] msg = { "t": res["t"], "y": "r", "r": { "id": self.table.nid, "nodes": encodeNodes(closeNodes), "token": token } } (ip, port) = address self.table.append(KNode(nid, ip, port)) self.sendResponse(msg, address) except KeyError: pass
def pingReceived(self, res, address): """ 回应ping请求 """ try: nid = res["a"]["id"] msg = {"t": res["t"], "y": "r", "r": {"id": self.table.nid}} (ip, port) = address self.table.append(KNode(nid, ip, port)) self.sendResponse(msg, address) except KeyError: pass
def findNodeHandle(self, res): """ 处理find_node回应数据 """ try: nodes = decodeNodes(res["r"]["nodes"]) for node in nodes: (nid, ip, port) = node if nid == self.table.nid: continue #不存自己 self.table.append(KNode(nid, ip, port)) #"等待"NEXT_FIND_NODE_INTERVAL时间后, 进行下一个find_node reactor.callLater(NEXT_FIND_NODE_INTERVAL, self.findNode, (ip, port)) except KeyError: pass
def findNodeReceived(self, res, address): """ 回应find_node请求 """ try: target = res["a"]["target"] closeNodes = self.table.findCloseNodes(target, 16) if not closeNodes: return msg = { "t": res["t"], "y": "r", "r": {"id": self.table.nid, "nodes": encodeNodes(closeNodes)} } nid = res["a"]["id"] (ip, port) = address self.table.append(KNode(nid, ip, port)) self.sendResponse(msg, address) except KeyError: pass