2015-11-01 5 views
0

Я пытаюсь реализовать биторентный клиент, и я застрял в этой части, я был успешно связан с одноранговым узлом, но я не знаю, как общаться с партнером.Протокол Bittorrent Протокол TCP-связи

Мне удалось декодировать файл метаданных torrent, я успешно получил всю информацию оттуда, я подключился к одноранговому узлу с TCP, я отправляю сообщение подтверждения, я получаю сообщение подтверждения от однорангового узла, но после этого я не получайте сообщения от партнера (я ожидал, что у вас есть сообщения). Я попытался отправить сообщение unchoke для сверстника, и я начал получать некоторые данные, но я не знаю, как понять эти данные.

Это то, что я до сих пор:

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 байт, это приводит к тому, что сообщение имеет огромную длину, и у меня нет большого сообщения.

Есть ли какой-либо шум, который я должен попробовать и отфильтровать? Если вы перейдете вправо, вы увидите, что в какой-то момент байты начинают прилично, но я не знаю, что делать с началом сообщения.

ответ

0

s.recv (4096)

Вы просто читаешь блок данных неопределенной длины, по-видимому, что находится в буфере TCP.

Bittorrent основан на сообщениях. TCP - это поток байтов, что означает, что он не красиво прерывает данные, отправленные удаленным одноранговым узлом, в сообщения, вам придется сделать это самостоятельно.

+0

Я знаю это, но я не знаю, как нарезать данный поток в сообщениях bittorrent. В протоколе bittorrent говорится, что формат сообщения представляет собой полезную нагрузку length_prefix (4 байта большого конца) message_id (1 байт) (length_prefix - 1 байт). Однако первые 4 байта в потоке 255, которые дают огромную длину, и у меня даже не так много байтов. –

+0

Я вижу 2 'recv' там. Это уже разрывает ваш поток на два куска, которые не разделены ни на какой значимой границе. вы должны посмотреть на весь поток. Опять же, выполнение произвольных (* до * 4096 байт) чтений не даст вам ничего при полезных смещениях. Вы не рассуждаете об этом как о непрерывном потоке. – the8472

+0

Да, и я действительно проверял это на самом деле. Первое сообщение, которое я получаю из recv, - это сообщение подтверждения, и я проверил, что там ничего не осталось. Все биты в первом recv-сообщении учитываются и являются частью сообщения подтверждения. В принципе, даже если бы я объединил два сообщения и попытался разделить, я бы получил то же самое, потому что я бы успешно разобрал сообщение рукопожатия в начале, а затем у меня было бы 4 255 байт, которые должны представлять длину следующего сообщения, но это недействительно потому что это было бы слишком большим. –

Смежные вопросы