我试图通过提供磁性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分钟内获取?
这是如何运作的?
答案 0 :(得分:3)
没有任何时间可以肯定地说永远不会获取元数据。
假设有一个人在他们的机器上有完整的信息。他们将在两年后开启他们的PC并加入群体和DHT。
如果等了两年,下载就会成功。否则它会失败。
你必须随意决定你愿意等多久:没有“保证”失败。
答案 1 :(得分:3)
如果您有兴趣知道某人现在是否有元数据(或多或少),我的基本建议是您至少等待一个DHT宣布间隔。
有几个步骤需要成功:
从技术上讲,每个步骤都可能有一个单独的超时。假设你是自助式的,并且与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。在这些位被清除之前,假设对等体存活或存在是不安全的。