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

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

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

如果您等待两年,下载将成功。否则会失败。

你必须任意决定你愿意等待多长时间:没有失败的“保证”。

于 2015-09-27T13:23:24.327 回答
3

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

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

有几个步骤需要成功:

  1. DHT 引导程序(查找 DHT 节点)
  2. DHT 宣布(寻找 BitTorrent 同行)
  3. 连接到同行
  4. 具有具有元数据(并支持元数据扩展)的对等点。绝大多数同行都支持这个扩展。

从技术上讲,每个步骤都可以有一个单独的超时。假设您已启动并与 DHT 建立了有效的连接,接下来需要考虑的是实际确保向 DHT 的通告工作并完成。

Torrents 应该每15 分钟向 DHT 发布一次。它可以在 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 间隔(60 秒)以确保在放弃之前有机会了解更多对等点,以防对等点本身没有元数据或不发送它。

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

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

于 2015-09-27T19:12:47.227 回答