Я потратил немного свободного времени на написание клиента 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();