2

私は 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();
4

4 に答える 4

2

MonoTorrentは、Mono に付属する BitTorrent 実装です。HTTPTracker クラスにはメソッドがありCreateAnnounceStringます。たぶん、実装をそのメソッドがどのように行っているかを比較できますか? (おそらく、AnnounceParametersインスタンスが作成された場所を突き止める必要があります。)

于 2009-07-09T01:00:32.807 に答える
1

正確には何をハッシュしていますか?トレントファイル全体ではなく、セクションのみをハッシュする必要がありinfoます...したがって、基本的には、ファイルをデコードし、infoセクションを再エンコードして、ハッシュします。

すなわち。投稿されたトレントの場合、ハッシュする必要があるのは次のとおりです。

d6:lengthi241671490e4:name20:so-export-2009-07.7z12:piece lengthi262144e6:pieces18440:<lots of binary data>e
于 2009-07-09T00:43:47.260 に答える
1

これはあなたの問題に対する答えではありませんが、テストには役立つかもしれません。

オープンソースの PHP ベースの torrent トラッカーがあります。それらは信じられないほど非効率的です (昔、私は 1 つのキャッシング メカニズムを書きました) が、独自のローカル トラッカーをセットアップし、PHP コードを変更して、クライアントがトラッカーと通信するときにクライアントをデバッグできるようにすることができます。ローカルのクライアント サーバーをセットアップすると、トラブルシューティングがはるかに簡単になります。

于 2009-07-09T01:02:29.547 に答える
1

info_hash の URL %-encoding にエラーがあります。info_hash の最後の 2 バイトの先行ゼロが削除されました。

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 のアドレス バーにドロップされると、おそらくブラウザによって自動修正されます。

于 2016-10-16T05:56:59.303 に答える