4

私はrouter.utorrent.com、DHTサービスを軌道に乗せる可能性があるため、からの応答を得ようとしています. たとえば、次のようなマグネット リンクがあるとします。

xt=urn:btih:a78c852bcc0379e612e1bd794e1fd19061b84d11

ハッシュは次のとおりです。

a78c852bcc0379e612e1bd794e1fd19061b84d11

次に、ターミナルで次のように入力しました。

nc -u router.utorrent.com 6881


d1:ad2:id20:a78c852bcc0379e612e1bd794e1fd19061b84d11e1:q4:ping1:t1:01:y1:qe

このドキュメントに基づいていますが、応答がありません。Wireshark を試して、パケットが戻ってくるかどうかを確認しましたが、それでも何もありませんでした。μTorrent が私に話しかけないのはなぜですか?

4

2 に答える 2

3

ハッシュはバイナリである必要があります。ベンコーディングでは、数字 + コロンは文字列の長さのプレフィックスです。16 進数の sha1 は 40 バイトの長さです。実際には 20 バイトの長さであるためには、ハッシュ関数の生の出力である必要があります。

基本的に、16 進文字列をバイナリに変換する必要があります (40 hex -> 20 バイナリ)。

于 2012-10-29T22:32:42.433 に答える
1

他の回答で説明したように、ベンコーディングはバイナリ形式であり、テキスト形式ではありません。端末を使用してメッセージ本文を netcat に入力しようとしているようです。端末は、バイナリではなくテキスト入力をプログラムに入力するように設計されているため、そのシーケンスを netcat の stdin に直接入力することはできません。

ping リクエストの ID は、トレントの情報ハッシュであってはなりません。DHT ネットワークに対してクライアントを識別するための一意の ID である必要があります。テストでは、完全に 20 個の ASCII 文字で構成される ID を選択して、これらのエンコーディングの問題を回避することもできますが、実際には、均一にランダムなバイナリ ID を使用する必要があります。

端末でバイナリ ID が必要な場合は、netcat に直接入力しないでください。代わりに、シェルのechoコマンドと 16 進エンコーディングを使用して、目的の形式でデータを生成し、それを netcat にパイプすることができます。たとえば、bash では次のようになります。

echo -n $'d1:ad2:id20:\x23\x71\x0c\x1c\xb4\x50\x7d\x87\x29\xb8\x3f\x87\x2c\xc6\xa2\xa4\x4c\x39\x73\x67e1:q4:ping1:t1:01:y1:qe' | nc -u router.utorrent.com 6881

ノードから取得する応答はエスケープされていないバイナリであり、必ずしもテキストではないことに注意してください。したがって、ここで行っているように端末に直接表示すると、何かが奇妙に表示されたり、現在の端末セッションが何らかの形でめちゃくちゃになったりする可能性があります。

于 2014-03-07T18:24:39.460 に答える