如何使用 python libtorrent DHT 播种?

How to seed with python libtorrent DHT?

我有 Ubuntu 带有 libtorrent 的服务器,python-libtorrent 和带有 uTorrent 的本地电脑 Win10。

On Server I want create 1.torrent and start seeding it on server

On PC I want load 1.torrent to uTorrent and download it using DHT

我做了脚本:创建1.torrent文件,添加到DHT。

import libtorrent as lt
import sys, time


videoFile = "/tmp/1/1.mp4.gpg"
workingPath = "/tmp/1"

#Create torrent

f = lt.file_storage()
lt.add_files(f, videoFile)
t = lt.create_torrent(f)
t.add_node("router.utorrent.com", 6881)
t.add_node("dht.transmissionbt.com", 6881)
lt.set_piece_hashes(t, workingPath)
torrent = t.generate()
f = open("/tmp/1/1.torrent", "wb")
f.write(lt.bencode(torrent))
f.close()

#Seeding

PORT_RANGE = (6881,6891)
s = lt.session()
s.listen_on(PORT_RANGE[0],PORT_RANGE[1])
s.add_dht_router('router.utorrent.com',6881)
s.start_dht()
print "DHT start: ", s.is_dht_running()
print "DHT state: ", s.dht_state()


params = {
            'save_path': workingPath,
            'storage_mode': lt.storage_mode_t.storage_mode_sparse,
            'ti': lt.torrent_info(torrent),
            'seed_mode': True,
            'paused': False,
            'upload_mode':True,
            'super_seeding':True
        }
h = s.add_torrent(params)
print("Total size: " + str(h.status().total_wanted))
print("Name: " + h.name())
while True:
    s = h.status()
    msg = '\r%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s'
    print(msg % (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, s.num_peers, s.state))
    sys.stdout.flush()
    time.sleep(1)

输出为

# python 1.py
DHT start:  True
DHT state:  {'node-id': 'HgH\xcd\xe3\xbc\x9b\xa9\x9b\xf6\xbf\xe7E\xd9\x1d.\xd9<\x838'}
Total size: 82500767
Name: 1.mp4.gpg
100.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) seeding
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) checking_resume_data
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) checking_resume_data
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) checking_resume_data
....
....
....
0.00% complete (down: 0.0 kb/s up: 0.0 kB/s peers: 0) checking_resume_data

windows 电脑上的 Utorrent 状态为 'Connecting to peers'

为什么我不能通过 libtorrent dht 种子种子?

您正在将 seed_mode 设置为 True。这将使 libtorrent 假设 您拥有 torrent 的所有文件,因此状态为 "seeding".

一旦你得到一个对等点,它请求一个块,libtorrent 实际上会去打开文件,它也会实际验证片段哈希(以避免上传损坏的数据)。但是,如果该文件不存在,则 torrent 将转换为检查模式,在该模式下它不再相信它 种子。它将检查所有文件。

检查文件的第一步是检查简历数据(您过渡到的数据)。但是,这通常非常快,随后会转换为检查文件状态。

由于某种原因,这似乎没有发生。要解决问题,您应该 pop_alerts() 并将它们打印到日志中,并可能启用更多警报,例如 torrent_log 警报。

但是,您遇到的第一个问题似乎是您没有要播种的文件。但是,如果没有警报日志,很难诊断出这一点。