Общение с бицтирентным клиентом, слушающим порта?
-
24-09-2019 - |
Вопрос
У меня есть один из моих компьютеров, высевающих торрент-файл на порту 45000. Я пытаюсь написать маленький клиент в Python (или, возможно, Perl), который помогает мне определить типы сообщений, которые поддерживают этот клиент, для которого мне нужно, возможно, сделать рукопожатие с клиентом. В Azureus это сделано с использованием звонка, такого как Peer.getSupportedMessages (). Можно ли сделать это, используя немного библиотеки в Python или Perl?
Пример возвращенных сообщений будет выглядеть так:
BT_KEEP_ALIVE
BT_PIECE
BT_REQUEST
BT_UNCHOKE
BT_UNINTERESTED
BT_SUGGEST_PIECE
BT_HAVE_ALL
BT_HAVE_NONE
BT_REJECT_REQUEST
BT_ALLOWED_FAST
BT_LT_EXT_MESSAGE
BT_DHT_PORT
lt_handshake
ut_pex
Решение
Из того, что я могу сказать, список поддерживаемых сообщений является частью пользовательского сообщения рукопожатия, поддерживаемого только Azureus (и, возможно, некоторые инструменты, совместимые на Azureus) и не являются частью официальной системы BitTorrent. Однако вы, вероятно, можете создать рукопожатие BENCODED AZ, отправьте его на сеялку, декодируйте ответ и посмотрите, какие поддерживаемые сообщения.
Azhandshake.java имеет детали того, что должно выглядеть сообщение.
С использованием Бенкуд Модуль от CPAN, вы могли бы сделать что-то вроде:
my $handshake = bencode {
identity => '', client => '', ... }; # All fields from AZHandshake.java
# send handshake to seeder and get a response
my $handshake_response = ...
my $dictionary = bdecode $handshake_response;
print join "\n", @{$dictionary->{messages}}, "\n";
Конечно, трюк будет в создании правильного рукопожатия, который будет вызывать действительный ответ от сеятеля. К сожалению, я не знаю ничего, что просто сделаю это, не требуя немного программирования.