@Bleno

Как сделать handshake с пиром в сети BitTorrent?

Вот мой код:

import socket
import time

sock = socket.socket()
sock.connect((peer_id, peer_port))

message = b'\x13BitTorrent protocol\x00\x00\x00\x00\x00\x00\x00\x00' + bytes('1A6948C96FA8302C74DA680C7360D1486A52B2F9'.lower(), encoding="UTF8") + b'66788486352714431784'

sock.send(message)

print('s')

while True:
    try:
        resp = sock.recv(len(message))
        print(resp)
        if resp != b'':
            break
    except:
        pass


В ответ от пира я получаю пустую строку b''. Причём эта строка постоянно печатается в консоли
В чём проблема?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
@Bleno Автор вопроса
В строке 7 info_hash нужно закодировать в байты вот так:
hashlib.sha1(torrent_file['info']).digest()

А в своём коде я использовал метод hexdigest. Конечный код выглядит так:
import hashlib
import bencode
import random
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((peer_ip, peer_host))

torrent_file = bencode.decode(open('test.torrent', 'rb').read())
info_hash_raw = hashlib.sha1(bencode.bencode(torrent_file['info'])).digest()


message = b'\x13BitTorrent protocol\x00\x00\x00\x00\x00\x10\x00\x05' + info_hash_raw + bytes(str(random.randint(10**20, 10**21-1)), encoding="UTF-8")

sock.send(message)

while True:
	try:
		resp = sock.recv(len(message))
		print(resp)
		break
	except:
		pass
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы