python libtorrent在使用磁体URI时我应该等待多长时间的元数据?

时间:2015-09-25 12:52:34

标签: python libtorrent magnet-uri

我试图通过提供磁性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分钟内获取?

这是如何运作的?

2 个答案:

答案 0 :(得分:3)

没有任何时间可以肯定地说永远不会获取元数据。

假设有一个人在他们的机器上有完整的信息。他们将在两年后开启他们的PC并加入群体和DHT。

如果等了两年,下载就会成功。否则它会失败。

你必须随意决定你愿意等多久:没有“保证”失败。

答案 1 :(得分:3)

Borealid指出,没有办法确定世界上不存在元数据的人(但目前处于离线状态)。

如果您有兴趣知道某人现在是否有元数据(或多或少),我的基本建议是您至少等待一个DHT宣布间隔。

有几个步骤需要成功:

  1. DHT bootstrap(查找DHT节点)
  2. DHT宣布(找到BitTorrent同行)
  3. 连接到同行
  4. 拥有具有元数据的对等体(并支持元数据扩展)。绝大多数同行支持此扩展。
  5. 从技术上讲,每个步骤都可能有一个单独的超时。假设你是自助式的,并且与DHT有一个有效的连接,那么下一个问题是确保DHT的宣布工作并完成。

    Torrent应该announce to the DHT 15 minutes 60 seconds。它可以在libtorrent中配置,称为dht_announce_interval。如果DHT出现问题导致其错过更新(例如,当您添加磁力链接时DHT没有完全自举),您可能需要再等15分钟才能再次发布。

    要记住的另一件事是,在libtorrent中,DHT宣布试图随着时间的推移或多或少地均匀分布。这意味着添加磁力链接时可能不会立即进行第一次尝试。

    为了更确定是否存在任何对等体,您还可以强制更新DHT(在torrent_handle对象上调用force_dht_announce())。如果您这样做几分钟(如果您没有找到任何同行),它也可以解决任何问题,使第一次宣布失败。

    一旦你有一个连接的bittorrent对等体,你可以相当确定DHT宣布成功(除非你从本地对等体发现我得到它)。查看对等列表(torrent_handle :: get_peer_info())时,每个peer_info条目都有一个源标志字段,可以告诉您它是否来自DHT。

    一旦你有一个同伴,你可能想等一个PEX间隔({{3}})以确保你有机会在放弃之前了解更多同伴,以防同伴本身没有元数据或不发送它。

    没有简单的方法来判断对等体是否特别支持元数据或pex扩展,但如果它不支持扩展协议,它也不支持。你可以通过peer_info :: flags& peer_info :: supports_extensions。

    只要在标志字段中设置了peer_info ::连接或peer_info :: handshake位,对等体就可能只是一个曾经是swarm一部分的随机IP。在这些位被清除之前,假设对等体存活或存在是不安全的。