BitTorrent трекер объявил о проблеме

Я потратил немного свободного времени на написание клиента 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 & = событие начала

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

d14: причина ошибки32: недопустимый хэш информации и / или одноранговый интерфейс

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

d8: completei2e11: внешний ip13:168.7.249.11110: незаконченный i0e8:intervali600e5:peerslee

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

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

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

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

РЕДАКТИРОВАТЬ
Я не использовал шестнадцатеричное кодирование info_hash, что помогает.

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

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

4 ответа

Решение

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

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

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

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

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

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

Произошла ошибка в 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, она, вероятно, автоматически корректируется браузером.

Другие вопросы по тегам