3

マグネットURIを提供してDHTからメタデータをダウンロードしようとしていますが、単一のURIで5分以上かかる場合があります。

私はこのようなコードを使用しています

while (not handle.has_metadata()):
    try:
        sleep(1)
    except KeyboardInterrupt:
        print("Aborting...")
        ses.pause()
        print("Cleanup dir " + tempdir)
        shutil.rmtree(tempdir)
        sys.exit(0)
ses.pause()
print("Done")

では、メタデータを待つ必要があるのはどれくらいですか? または、メタデータを取得するために新しいマグネット uri の新しいハンドルを作成している間、そのハンドルをアクティブに保つことができますか?

タイムアウト設定などはありますか?

アップデート :

私が言いたいのは、マジック ナンバーがあるということです。X 分としましょう。X 分でメタデータを取得できない場合、たとえば 24 時間でメタデータを取得できません。

または、24 時間でフェッチできるが、最初の x 分ではフェッチできない可能性はありますか?

これはどのように正確に機能しますか?

4

2 に答える 2

4

メタデータが決してフェッチされないと断言できる時点はありません。

自分のマシンに関する完全な情報を持っている人が 1 人いるとします。彼らは PC の電源を入れ、今から 2 年後に群れと DHT に参加します。

2 年待てば、ダウンロードは成功します。そうしないと失敗します。

待機する時間を任意に決定する必要があります。失敗の「保証」はありません。

于 2015-09-27T13:23:24.327 に答える
3

Borealid が指摘しているように、メタデータを持つ誰かが世界に存在しないことを確認する方法はありません (ただし、現時点ではオフラインです)。

誰かが現在 (多かれ少なかれ) メタデータを持っているかどうかを知りたい場合、私の基本的な提案は、少なくとも 1 つの DHT アナウンス間隔を待つことです。

成功するために必要ないくつかの手順があります。

  1. DHT ブートストラップ (DHT ノードの検索)
  2. DHT アナウンス (BitTorrent ピアの検索)
  3. ピアへの接続
  4. メタデータを持つ (およびメタデータ拡張をサポートする) ピアを持つこと。ピアの大部分は、この拡張機能をサポートしています。

技術的には、各ステップに個別のタイムアウトを設定できます。ブートストラップされ、DHT への有効な接続があると仮定すると、次の懸念事項は、DHT へのアナウンスが機能して完了することを実際に確認することです。

トレントは15 分ごとに DHT に通知することになっています。ただし、dht_announce_interval と呼ばれる libtorrent で構成可能です。DHT に何らかの問題があり、更新を見逃している場合 (たとえば、マグネット リンクを追加したときに DHT が完全にブートストラップされていない場合)、再度通知されるまでさらに 15 分間待つ必要がある場合があります。

心に留めておくべきもう1つのことは、libtorrentでは、DHTアナウンスが時間の経過とともに多かれ少なかれ均等に配布されるように試みられていることです. これは、マグネット リンクが追加された直後に最初の試行が行われない可能性があることを意味します。

ピアが存在するかどうかをより確実にするために、DHT を強制的に更新することもできます (torrent_handle オブジェクトで force_dht_announce() を呼び出します)。これを数分間行うと (ピアが見つからない場合)、最初のアナウンスが失敗する問題に対処することもできます。

接続された bittorrent ピアを取得したら、DHT アナウンスが成功したことをかなり確信で​​きます (ローカル ピア ディスカバリーから取得した場合を除きます)。ピア リスト (torrent_handle::get_peer_info()) を見ると、各 peer_info エントリにはソース フラグ フィールドがあり、DHT からのものかどうかがわかります。

ピアを取得したら、ピア自体がメタデータを持っていないか、送信していない場合に備えて、あきらめる前に、より多くのピアについて学習する機会があることを確認するために、1 PEX 間隔 ( 60 秒) 待機することをお勧めします。それ。

ピアがメタデータまたは pex 拡張機能を具体的にサポートしているかどうかを判断する簡単な方法はありませんが、拡張プロトコルをサポートしていない場合は、どちらもサポートしていません。これは、peer_info::flags と peer_info::supports_extensions で確認できます。

peer_info::connecting または peer_info::handshake ビットがフラグ フィールドに設定されている限り、ピアはスウォームの一部であったランダムな IP である可能性があります。これらのビットがクリアされるまで、ピアが生きている、または存在すると仮定するのは安全ではありません。

于 2015-09-27T19:12:47.227 に答える