<p>正如Borealid指出的,无法确定拥有元数据的人在世界上不存在(但目前处于离线状态)。在</p>
<p>如果您有兴趣知道某人现在是否有元数据(或多或少),我的基本建议是您至少等待一个DHT公告间隔。在</p>
<p>有几个步骤需要成功:</p>
<ol>
<li>DHT引导(查找DHT节点)</li>
<li>DHT公告(查找BitTorrent对等机)</li>
<li>连接到对等点</li>
<li>拥有具有元数据(并支持元数据扩展)的对等方。绝大多数同行都支持这种扩展。在</li>
</ol>
<p>从技术上讲,每一步都有一个单独的超时。假设您已经引导并与DHT建立了有效的连接,下一个问题是实际确保对DHT的公告有效并完成。在</p>
<p>Torrents应该是<a href="https://github.com/arvidn/libtorrent/blob/master/src/session_impl.cpp#L3471" rel="nofollow">announce to the DHT</a>每隔<a href="https://github.com/arvidn/libtorrent/blob/master/src/settings_pack.cpp#L286" rel="nofollow">15 minutes</a>。不过,它可以在libtorrent中配置,称为dht_announce_interval。如果DHT有问题导致它错过更新(比如,DHT在添加magnetic链接时没有完全引导),那么您可能需要再等待15分钟,它才会再次发布。在</p>
<p>另一件事是要均匀地在脑海里播报。这意味着第一次尝试可能不会在添加磁铁链接时立即进行。在</p>
<p>为了更确定是否有对等方,还可以强制更新DHT(在torrent_handle对象上调用force_DHT_announce())。如果你在几分钟内这样做(如果你还没有找到任何同行),它也可能会阻止任何问题,使第一次宣布失败。在</p>
<p>一旦你有了一个连接的bittorrent对等机,你就可以相当确定DHT的宣布成功了(除非你是从本地对等发现中得到的)。查看对等列表(torrent_handle::get_peer_info())时,每个peer_info条目都有一个源标志字段,可以告诉您它是否来自DHT。在</p>
<p>一旦你有了一个对等点,你可能需要等待一个PEX间隔(<a href="https://github.com/arvidn/libtorrent/blob/master/src/ut_pex.cpp#L434" rel="nofollow">60 seconds</a>),以确保你有机会了解更多的对等点,然后再放弃,以防对等点本身没有元数据或没有发送它。在</p>
<p>没有简单的方法来判断对等方是否支持元数据或pex扩展,但是如果它不支持扩展协议,它也不会支持这两种扩展协议。您可以通过peer_info::flags和peer_info::支持_扩展来判断。在</p>
<p>只要在flag字段中设置了peer_info::connecting或peer_info::handshake位,则该对等端可能只是以前作为群的一部分的随机IP。在清除这些位之前,假设对等点是活动的或存在的是不安全的。在</p>