如何使用 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 警报。
但是,您遇到的第一个问题似乎是您没有要播种的文件。但是,如果没有警报日志,很难诊断出这一点。
我有 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 警报。
但是,您遇到的第一个问题似乎是您没有要播种的文件。但是,如果没有警报日志,很难诊断出这一点。