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

python libtorrent How long should i wait for meta data while using 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 分钟?

这究竟是如何工作的?

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

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

等两年,下载就会成功。否则会失败。

您必须任意决定您愿意等待多长时间:没有 "guarantee" 的失败。

正如 Borealid 指出的那样,无法确定世界上不存在拥有元数据的人(但目前处于离线状态)。

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

成功需要几个步骤:

  1. DHT bootstrap(寻找DHT节点)
  2. DHT 公告(寻找 BitTorrent 节点)
  3. 连接到同行
  4. 有一个具有元数据(并支持元数据扩展)的对等体。绝大多数同行都支持这个扩展。

从技术上讲,每个步骤都可以有一个单独的超时。假设您已 bootstrapped 并与 DHT 建立了有效连接,下一个问题是实际确保向 DHT 的公告有效并完成。

种子应该 announce to the DHT every 15 minutes。不过它可以在 libtorrent 中配置,称为 dht_announce_interval。如果 DHT 出现问题导致它错过更新(例如,当您添加磁铁 link 时 DHT 未完全 bootstrapped),您可能需要再等待 15 分钟再次宣布。

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

为了更加确定是否存在任何对等点,您还可以 force_update DHT(在 torrent_handle 对象上调用 force_dht_announce())。如果您在几分钟内执行此操作(以防您没有找到任何对等方),它也可能会解决导致第一次公告失败的任何问题。

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

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

没有简单的方法可以判断一个对等点是否具体支持元数据或 pex 扩展,但如果它不支持扩展协议,则两者都不支持。你可以通过 peer_info::flags & peer_info::supports_extensions.

来判断

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