正如 Borealid 指出的那样,无法确定世界上不存在具有元数据的人(但目前处于离线状态)。
如果您想知道某人现在(或多或少)是否有元数据,我的基本建议是您至少等待一个 DHT 宣布间隔。
有几个步骤需要成功:
- DHT 引导程序(查找 DHT 节点)
- DHT 宣布(寻找 BitTorrent 同行)
- 连接到同行
- 具有具有元数据(并支持元数据扩展)的对等点。绝大多数同行都支持这个扩展。
从技术上讲,每个步骤都可以有一个单独的超时。假设您已启动并与 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,它曾经是群的一部分。在这些位被清除之前,假设对等点还活着或存在是不安全的。