2009-07-09 12 views
2

私はBitTorrentクライアントを作成する際に少し空き時間を投げかけてきましたが、主に好奇心を払っていましたが、C#のスキルを向上させたいという願いからでした。BitTorrentトラッカー発表の問題

the theory wikiをガイドとして使用しています。 BEncodingを処理するためのクラスのライブラリを構築しました。これはかなり自信があります。基本的には、正当性チェックは、解析後直ちに元の.torrentファイルを自分の内部表現から再生成し、ハッシュして比較することです。

次の段階は、トラッカーが動作することをアナウンスすることです。ここでは、トラブラが非常に有用なエラーメッセージなしで私の要求を拒否するので、私はつまずくブロックを打つ。

たとえば、latest stack overflow database dumpとします。私のコードは、以下の発表URIを生成します。

 
http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=&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)しており、ピアIDがうまく形成されていると確信しています。

私の推測では、私はちょっとばかげたばかげたことをやっているのですが、それが正確であることを発見する助けに感謝します。

どのようなコードが適切であるかを推測するのは難しいです(しかも投稿するのはずっとあります)。しかし、私は何かを求めて投稿しようとします。

EDIT
は、私は一種の助けinfo_hashをコードする六角ませんでした。

これは、URIを生成し、応答を取得するのを試みる取るコードです:あなたは正確に

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

答えて

2

MonoTorrentはモノラルに付属しているBitTorrentの実装です。 HTTPTracker classには、CreateAnnounceStringメソッドがあります。 あなたの実装をそのメソッドがどのようにしているのかを比較できますか? (おそらく、AnnounceParametersインスタンスが作成された場所を探し出す必要があります)

1

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

ie。急流を投稿するために、すべてのあなたがする必要がありますハッシングは次のとおりです。

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

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

オープンソースのPHPベースのトレントトラッカーがあります。彼らは信じられないほど非効率的です(私は1日のためにキャッシング機構を書いていました)。しかし、あなた自身のローカルトラッカーをセットアップし、トラッカーと通信する際にクライアントをデバッグするのに役立つPHPコードを変更できます。ローカルのクライアント/サーバーのセットアップを行うと、トラブルシューティングがずっと簡単になります。

1

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