def start_download(self): tracker_ip = "http://{}/announce".format(ReadFile.getTrackerIp(self.file_path)) hostname = socket.gethostname() myip = socket.gethostbyname(hostname) peerId = ReadConfig.getPeerId(CONFIG_PATH) info_hash = ReadFile.getInfoHash(self.file_path) port = ReadConfig.getPort(CONFIG_PATH) peers = Peers.getPeers(tracker_ip, info_hash, myip, port, 0, peerId) piece_length = ReadFile.getPieceLength(self.file_path) q = self.getRemainingPieces() for p in peers: if(q.empty()): break s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((p['ip'], int(p['port']))) handshake = Messages.handshake(info_hash, peerId) s.send(handshake.encode()) data = s.recv(piece_length) if(data != b'ok'): s.close() continue cnt = 0 while not q.empty(): elem = q.get() msg = '0001{}'.format(str(elem)) s.send(msg.encode()) data = s.recv(piece_length) if(self.verifyHash(data, elem)): self.saveFile(data.decode('utf-8'), elem) cnt = 0 else: q.put(elem) cnt = cnt + 1 if cnt == 10: break s.send(b"0002") data = s.recv(piece_length) s.close() temp = "{}{}".format(os.path.splitext(self.output_path)[0], "/temp") ConcatenateFile.concatenateFile(self.file_path, self.output_path, temp) temp = os.path.splitext(self.output_path)[0] shutil.rmtree(temp)