Example #1
0
  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)