1

我正在使用 libtorrent 1.0.9 和自定义绑定(可使用 python 重现)。有时我无法下载磁铁,因为它们在没有元数据的情况下被卡住(虽然有超过 200 个 DHT 节点可用)。我可以用这个磁铁重现这个问题:

magnet:?xt=urn:btih:565DB305A27FFB321FCC7B064AFD7BD73AEDDA2B&dn=bbb_sunflower_1080p_60fps_normal.mp4&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.publicbt.com%3a80%2fannounce&ws=http%3a%2f%2fdistribution.bbb3d.renderfarming.net%2fvideo%2fmp4%2fbbb_sunflower_1080p_60fps_normal.mp4

与此同时,在其他 torrent 客户端(qBittorrent、Vuze)中,它可以非常快速地获取元数据。可以使用以下代码重现:

import libtorrent as lt
import time

session = lt.session()
session.listen_on(6881, 6891)
session.add_extension('ut_metadata')
session.add_extension('ut_pex')
session.add_extension('metadata_transfer')
session.add_dht_router("router.utorrent.com", 6881)
session.add_dht_router("router.bittorrent.com", 6881)
session.add_dht_router("dht.transmissionbt.com", 6881)
session.add_dht_router("dht.aelitis.com", 6881)
session.start_dht()
session.start_lsd()
session.start_upnp()
session.start_natpmp()

params = { 'save_path': '/tmp/'}
link ="magnet:?xt=urn:btih:565DB305A27FFB321FCC7B064AFD7BD73AEDDA2B&dn=bbb_sunflower_1080p_60fps_normal.mp4&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.publicbt.com%3a80%2fannounce&ws=http%3a%2f%2fdistribution.bbb3d.renderfarming.net%2fvideo%2fmp4%2fbbb_sunflower_1080p_60fps_normal.mp4"
handle = lt.add_magnet_uri(session, link, params)

print('downloading metadata...')
while (not handle.has_metadata()):
    status=session.status()
    print('dht nodes: ', status.dht_nodes)
    time.sleep(1)
print ('got metadata, starting torrent download...')
while (handle.status().state != lt.torrent_status.seeding):
    print('%d %% done' % (handle.status().progress*100))
    time.sleep(1)

我做错了什么?

4

1 回答 1

2

这很可能是由 1.0.x 系列中的一个问题引起的,其中一些来自 DHT 的第一个响应会使节点更改其节点 ID(以匹配其外部 IP 地址,请参阅这篇文章)。

它通过重新启动 DHT 节点来做到这一点。当时宣布的任何飞行中的洪流都将丢失。等待 15 分钟等待下一个公告应该会使公告通过。另一种选择是在将第一个 torrent 添加到会话之前等待dht_bootstrap_alert

此问题已在 1.1.x 版本中修复。

于 2016-10-12T05:05:11.490 回答