BitTorrent трекер объявил о проблеме - PullRequest
2 голосов
/ 09 июля 2009

Я потратил немного свободного времени на написание клиента BitTorrent, в основном из любопытства, но отчасти из-за желания улучшить свои навыки в C #.

Я использовал теорию вики в качестве руководства. Я собрал библиотеку классов для обработки BEncoding, в которой я уверен; в основном потому, что проверка работоспособности заключается в том, чтобы сразу после синтаксического анализа восстановить исходный файл .torrent из моего внутреннего представления, а затем хэшировать и сравнивать.

Следующий этап - заставить работать объявления трекера. Здесь я наткнулся на камень преткновения, потому что трекеры отклоняют мои запросы без ужасно полезных сообщений об ошибках.

Возьмем, к примеру, последний дамп базы данных переполнения стека . Мой код генерирует следующий URI объявления:

http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started

Ответ трекера на мой код:

d14:failure reason32:invalid info hash and/or peer ide

Ответ трекера на эту строку выпал в адресную строку Chrome:

d8:completei2e11:external ip13:168.7.249.11110:incompletei0e8:intervali600e5:peerslee

peer_id - это (действительный) мусор, но изменение его на что-то разумное (олицетворение широко используемого клиента) ничего не меняет.

Как я уже сказал, я почти уверен, что правильно извлекаю информационный словарь и хеширую (SHA1), как и должен, и идентификатор сверстника сформирован правильно.

Полагаю, я делаю какую-то мелочь, глупо неправильно, и буду признательна за любую помощь в определении того, что это такое.

Трудно догадаться, какой код будет уместным (и многое можно просто опубликовать). Тем не менее, я постараюсь опубликовать все, что просили.

EDIT
Я не использовал шестнадцатеричное кодирование info_hash, что помогает.

Это код, который генерирует URI и пытается получить ответ:

//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();

Ответы [ 4 ]

2 голосов
/ 09 июля 2009

MonoTorrent - это реализация BitTorrent, которая поставляется с Mono. В классе HTTPTracker есть метод CreateAnnounceString. Может быть, вы можете сравнить свою реализацию с тем, как это делает этот метод? (Вам, вероятно, нужно найти место, где создан экземпляр AnnounceParameters.)

1 голос
/ 16 октября 2016

Произошла ошибка в URL-кодировании% info_hash. Ведущие нули в двух последних байтах info_hash были удалены.

It is:     info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C
Should be: info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%0F%0C  

Когда строка объявления помещается в адресную строку Chrome, она, вероятно, автоматически корректируется браузером.

1 голос
/ 09 июля 2009

Это не ответ на вашу проблему, но может помочь при тестировании.

Существуют торрент-трекеры с открытым исходным кодом на основе PHP. Они невероятно неэффективны (я знаю, я написал механизм кэширования для одного в прошлом), но вы можете настроить свой собственный локальный трекер и изменить код PHP, чтобы помочь отладить ваш клиент, когда он общается с трекером. Наличие локальной настройки клиент-сервер значительно упростит устранение неполадок.

1 голос
/ 09 июля 2009

Что именно вы хэшируете? Вам следует хэшировать только раздел info, а не весь торрент-файл ... Итак, в основном, декодируйте файл, перекодируйте раздел info, хешируйте его.

есть. Для размещенного торрента все, что вы должны хэшировать, это:

d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e
...