Почему одноранговый узел не отправляет сообщение рукопожатия в ответ на сообщение рукопожатия, которое я отправляю?

Недавно я начал писать свой собственный клиент BitTorrent на Python 3. И все было прекрасно, пока я не столкнулся со следующей проблемой: Вместо ответного рукопожатия, когда я отправляю сообщение форматированного рукопожатия одному из пиров, я ничего не получаю (b'', когда бафф не декодируется). Вот код:

handshakemsg = chr(19)+"BitTorrent protocol"+8*chr(0)+
        getinfohash()+"HAHA-0142421214125A-")
s.send(handshakemsg.encode())
print("Connection to peer accepted")
buff = s.recv(len(handshakemsg))
print(buff)

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


person 3phase    schedule 02.02.2016    source источник
comment
Может быть, потому что вы неправильно написали протокол?   -  person Roddy    schedule 02.02.2016
comment
Нет, это не причина, я сделал это, чтобы проверить, что произойдет, если я отправлю неправильное рукопожатие, но я забыл изменить это здесь. Спасибо, что все равно напомнили   -  person 3phase    schedule 02.02.2016
comment
можешь показать бинарный вывод? захватить его с помощью Wireshark   -  person the8472    schedule 02.02.2016
comment
Да, конечно.. Вот: Ссылка на изображение   -  person 3phase    schedule 03.02.2016


Ответы (2)


http://bittorrent.org/beps/bep_0003.html#peer-protocol

После фиксированных заголовков идут восемь зарезервированных байтов, которые во всех текущих реализациях равны нулю. Если вы хотите расширить протокол, используя эти байты, пожалуйста, согласуйте это с Брэмом Коэном, чтобы убедиться, что все расширения совместимы. Далее идет 20-байтовый хэш sha1 закодированной формы значения информации из файла метаинформации.

У вас 40 (в шестнадцатеричном кодировании). Bittorrent — это бинарный протокол, а не текстовый.

person the8472    schedule 03.02.2016

Убедитесь, что все сообщение рукопожатия отправлено удаленному узлу, поэтому попробуйте использовать метод socket.sendall().

сдача:

s.send(handshakemsg.encode()) 

to:

s.sendall(handshakemsg.encode())
person likjjdblue    schedule 04.03.2016
comment
В текущей ситуации причина, по которой сообщение о рукопожатии не было правильно прочитано от однорангового узла, заключалась в том, что рукопожатие содержало свойство в шестнадцатеричном кодировании, а не в байтовом, как указано в утвержденном ответе. - person 3phase; 05.03.2016