Я пытаюсь реализовать клиент BitTorent, и я застрял на той части, где я успешно подключился к узлу, но я не знаю, как общаться с узлом.
Мне удалось расшифровать файл метаданных торрента, я успешно получил оттуда всю информацию, я подключился к пиру по TCP, я отправляю сообщение рукопожатия, я получаю сообщение рукопожатия обратно от пира, но после этого я не получаю любое сообщение от однорангового узла (я ожидал получить сообщения). Я попытался отправить одноранговому узлу сообщение о разблокировке и начал получать некоторые данные, но я не знаю, как понимать эти данные.
Это то, что у меня есть до сих пор:
s.connect((ip, port))
print "Connected"
message = "%s%s%s%s%s" % (chr(19), "BitTorrent protocol", 8 * chr(0),
handshake_params["info_hash"],
handshake_params["peer_id"]
s.send(message)
handshake_data = s.recv(4096)
# unchoke
m = struct.pack(">IB", 1, 1)
s.send(m)
data = s.recv(4096)
print handshake_data
print struct.unpack("B" * len(data), data)
И это вывод:
BitTorrent protocolp p�I0a��9"x`��-UT3450-��kP+�BG ���������
(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 231, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 255, 251, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 127, 255, 221, 255, 255, 255, 255, 255, 191, 191, 255, 255, 127, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 5, 4, 0, 0, 4, 191, 0, 0, 0, 5, 4, 0, 0, 1, 123, 0, 0, 0, 5, 4, 0, 0, 2, 122, 0, 0, 0, 5, 4, 0, 0, 2, 126, 0, 0, 0, 5, 4, 0, 0, 2, 177, 0, 0, 0, 5, 4, 0, 0, 2, 104, 0, 0, 0, 5, 4, 0, 0, 1, 37, 0, 0, 0, 5, 4, 0, 0, 0, 174, 0, 0, 0, 5, 4, 0, 0, 4, 157, 0, 0, 0, 5, 4, 0, 0, 0, 4, 0, 0, 0, 5, 4, 0, 0, 3, 172, 0, 0, 0, 5, 4, 0, 0, 2, 241, 0, 0, 0, 5, 4, 0, 0, 1, 90, 0, 0, 0, 5, 4, 0, 0, 3, 251, 0, 0, 0, 5, 4, 0, 0, 2, 200, 0, 0, 0, 5, 4, 0, 0, 0, 179, 0, 0, 0, 5, 4, 0, 0, 0, 180, 0, 0, 0, 5, 4, 0, 0, 3, 113, 0, 0, 0, 5, 4, 0, 0, 4, 181, 0, 0, 0, 5, 4, 0, 0, 1, 16, 0, 0, 0, 5, 4, 0, 0, 2, 169, 0, 0, 0, 5, 4, 0, 0, 4, 81, 0, 0, 0, 5, 4, 0, 0, 2, 57, 0, 0, 0, 5, 4, 0, 0, 1, 219)
Данные рукопожатия выглядят нормально. Чего я не могу понять, так это почему у меня там так много 255 байт. Я пытался декодировать сообщение, используя формат length_prefix, message_id, payload, но поскольку я получаю так много 255 байтов в начале, это приводит к тому, что сообщение имеет огромную длину, и у меня нет такого большого сообщения.
Есть ли какой-либо шум, который я должен попытаться отфильтровать? Если вы сильно прокрутите вправо, вы увидите, что в какой-то момент байты начинают прилично, но я не знаю, что делать с началом сообщения.