def request(self, piece, start, length): self.socket.send(builder('interested')) while True: message = parser(self.socket.recv(400000)) if not message: continue if message[0] == 'unchoke': self.socket.send(builder('request', piece, start, length)) if message[0] == 'piece': self.write_block(message[1]) return
def handle(socket, address): print green("Client connected") while True: data = socket.recv(2048) if not data: print red("Client disconnected") return message = parser(data) if message is None: return if message[0] == "transfer": transfer(message[1], socket)
def handle(socket, address): torrent = None while True: data = socket.recv(2048) if not data: print "Client disconnected" break if len(data) == 85: torrent = handshake(data, socket) continue message = parser(data) if message[0] == 'interested': message = builder('unchoke') socket.send(message) if message[0] == 'request': parse_request(socket, torrent, *message[1])
def transfer_from(self, client, to, how_much, times=0): if times >= 3: return False with open("db/clients.txt") as f: clients = f.read() if "%s:" % client not in clients: raise ValueError("%s is not a client" % client) if "%s:" % to not in clients: raise ValueError("%s is not a client" % to) client = sha1(client).hexdigest() to = sha1(to).hexdigest() message = builder('transfer', client, to, int(how_much), int(time.time())) self.socket.send(message) response = parser(self.socket.recv(2048)) if response is not None and response[0] == 'retry': time.sleep(1) self.transfer_from(client, to, how_much, times + 1) elif response is not None and response[0] == 'success': return True
def bitfield(self): if not self.handshake: return bitfield = self.socket.recv(2048) return parser(bitfield)[1]