使用python-libtorrent在不下载种子的情况下获取对等列表
我在用Python和libtorrent库获取种子的对等方IP地址。我尝试了以下代码:
import libtorrent as lt
import time
ses = lt.session()
ses.listen_on(6881, 6891)
info = lt.torrent_info('test.torrent')
h = ses.add_torrent({'ti': info, 'save_path': './'})
print 'starting', h.name()
while (not h.is_seed()):
s = h.status()
p = h.get_peer_info()
for i in p:
print i.ip
print "\n\n"
sys.stdout.flush()
time.sleep(1)
print h.name(), 'complete'
这个代码大致上能工作,但我遇到了两个问题:
- 种子已经下载完成。
- 在我收到一个对等方列表之前,这个循环执行了好几次。
你能帮我吗?
非常感谢!
1 个回答
7
没有一个统一的“对等节点列表”。你现在连接的节点就是你正在使用的对等节点。不过,还有一个概念是“整个网络中的所有对等节点”。
libtorrent可以告诉你你连接的对等节点,这意味着它们已经完成了uTP或TCP的三次握手。
通常,建立对等连接需要一些时间。你需要先找到对等节点,然后尝试连接它们,而这些节点也需要在线并且没有满员。这就是为什么你不会立刻连接到很多对等节点的原因。
听起来你对整个网络中的所有对等节点都感兴趣。但实际上,你不太可能找到每一个对等节点。对等节点可能不会向同一个跟踪器报告,它们可能通过PEX或DHT互相找到。很多对等节点是无法连接的,找到它们的唯一方法就是让它们主动找到你,但它们可能对这件事不感兴趣。
现在,如果你对下载这个种子文件不感兴趣,那你为什么还想要对等节点的IP地址呢?既然你不感兴趣,那为什么还要连接它们呢?
你可以简单地调用get_full_peer_list(),不过在Python的绑定中这个功能是不可用的。你也可以不断向跟踪器发送请求,收集得到的IP地址。