2016-10-10 71 views
0

我使用的是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 

与此同时,在其他洪流客户端(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) 

我在做什么错?

回答

2

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

它通过重新启动DHT节点来完成此操作。任何在这个时候发布的在线torrent都会丢失。等待下一个宣布15分钟应宣布通过。另一种选择是在将第一个洪流添加到会话之前等待dht_bootstrap_alert

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

+0

谢谢!这让我疯狂 – user37741