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