私は BitTorrent クライアントの作成に少しの時間を割いています。これは主に好奇心からですが、一部は C# のスキルを向上させたいという願望からです。
私は理論wikiをガイドとして使用してきました。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=開始
私のコードに対するトラッカーの応答:
d14:失敗の理由 32:無効な情報ハッシュおよび/またはピア ID
その文字列に対するトラッカーの応答が Chrome のアドレス バーにドロップされました。
d8:completei2e11:外部 ip13:168.7.249.11110:incompletei0e8:intervali600e5:peerslee
peer_id は (有効な) ガベージですが、適切なもの (広く使用されているクライアントになりすます) に変更しても何も変わりません。
私が言ったように、情報ディクショナリを適切に引き出して、必要なようにハッシュ (SHA1) していると確信しており、ピア ID は整形式です。
私の推測では、私はばかげて間違ったことをしているのだと思います。
どのコードが適切であるかを推測するのは難しいです (そして、投稿するだけでもたくさんあります)。ただし、求められたものは何でも投稿しようとします。
EDIT
私はinfo_hashを16進数でエンコードしていませんでした。
これは、生成された URI を受け取り、応答を取得しようとするコードです。
//uri is the above
WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();