Added tracker documentation and unified signatures of DHT, UDP and HTTP get_peers requests
parent
09a2e81d3d
commit
cbf1ad9fcf
20
README.md
20
README.md
|
@ -13,7 +13,7 @@ a single component.
|
||||||
|
|
||||||
- krpc.py - implements the basic UDP Kademila-RPC protocol layer
|
- krpc.py - implements the basic UDP Kademila-RPC protocol layer
|
||||||
- dht.py - contains the code for accessing the Mainline DHT using KRPC
|
- dht.py - contains the code for accessing the Mainline DHT using KRPC
|
||||||
|
- tracker.py - implements the UDP and HTTP tracker protocol for peer discovery
|
||||||
|
|
||||||
KRPC Implementation
|
KRPC Implementation
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -71,3 +71,21 @@ and allow access to the discovered external connection infos:
|
||||||
Start shutdown of the local DHT peer and all associated maintainance threads.
|
Start shutdown of the local DHT peer and all associated maintainance threads.
|
||||||
- get_external_connection()
|
- get_external_connection()
|
||||||
Return the discovered external connection infos
|
Return the discovered external connection infos
|
||||||
|
|
||||||
|
|
||||||
|
Tracker Implementation
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The tracker implementation provides functions to get the list of peers for a certain info_hash from
|
||||||
|
a HTTP or UDP tracker. Each function returns a list of connection tuples with possible peers for
|
||||||
|
the given info hash. The three non-optional parameters are the tracker url, info_hash and peer_id.
|
||||||
|
Optionally it is possible to provide the peer ip and peer port, the amount already uploaded and downloaded
|
||||||
|
as well as the amount left to download and the occasion / event of the request. This event can be
|
||||||
|
either 'started', 'stopped', 'completed' or 'empty' (for regular queries).
|
||||||
|
|
||||||
|
- http_get_peers(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0,
|
||||||
|
uploaded = 0, downloaded = 0, left = 0, event = 'started')
|
||||||
|
- udp_get_peers(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0,
|
||||||
|
uploaded = 0, downloaded = 0, left = 0, event = 'started', num_want = -1, key = 0)
|
||||||
|
With num_want it is possible to tell the tracker who many peers should be sent. The parameter key
|
||||||
|
should be a unique key that is randomized by the client.
|
||||||
|
|
14
tracker.py
14
tracker.py
|
@ -51,9 +51,9 @@ def decode_connections(data):
|
||||||
data = data[6:]
|
data = data[6:]
|
||||||
|
|
||||||
# Implementation of BEP #0015 (UDP tracker protocol)
|
# Implementation of BEP #0015 (UDP tracker protocol)
|
||||||
def udp_announce(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0, event = None,
|
def udp_get_peers(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0,
|
||||||
num_want = -1, downloaded = 0, uploaded = 0, left = 0, key = 0):
|
uploaded = 0, downloaded = 0, left = 0, event = 'started', num_want = -1, key = 0):
|
||||||
event = {None: 0, 'completed': 1, 'started': 2, 'stopped': 3}[event]
|
event = {'empty': 0, 'completed': 1, 'started': 2, 'stopped': 3}[event]
|
||||||
url = parse_url(tracker_url)
|
url = parse_url(tracker_url)
|
||||||
conn = (socket.gethostbyname(url.hostname), url.port)
|
conn = (socket.gethostbyname(url.hostname), url.port)
|
||||||
sock = UDPSocket(('0.0.0.0', 0))
|
sock = UDPSocket(('0.0.0.0', 0))
|
||||||
|
@ -117,8 +117,8 @@ def udp_announce(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0, even
|
||||||
sock.close()
|
sock.close()
|
||||||
|
|
||||||
# Implementation of BEP #0003 (Bittorrent - section: HTTP Tracker protocol)
|
# Implementation of BEP #0003 (Bittorrent - section: HTTP Tracker protocol)
|
||||||
def http_announce(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0, event = 'started',
|
def http_get_peers(tracker_url, info_hash, peer_id, ip = '0.0.0.0', port = 0,
|
||||||
uploaded = 0, downloaded = 0, left = 0):
|
uploaded = 0, downloaded = 0, left = 0, event = 'started'):
|
||||||
query = {b'info_hash': info_hash, b'peer_id': peer_id, b'ip': ip, b'port': port,
|
query = {b'info_hash': info_hash, b'peer_id': peer_id, b'ip': ip, b'port': port,
|
||||||
b'uploaded': uploaded, b'downloaded': downloaded, b'left': left, b'compact': 1}
|
b'uploaded': uploaded, b'downloaded': downloaded, b'left': left, b'compact': 1}
|
||||||
if event:
|
if event:
|
||||||
|
@ -132,5 +132,5 @@ if __name__ == '__main__':
|
||||||
import os, binascii
|
import os, binascii
|
||||||
peer_id = os.urandom(20)
|
peer_id = os.urandom(20)
|
||||||
info_hash = binascii.unhexlify('ae3fa25614b753118931373f8feae64f3c75f5cd') # Ubuntu 15.10 info hash
|
info_hash = binascii.unhexlify('ae3fa25614b753118931373f8feae64f3c75f5cd') # Ubuntu 15.10 info hash
|
||||||
print(http_announce('http://torrent.ubuntu.com:6969/announce', info_hash, peer_id))
|
print(http_get_peers('http://torrent.ubuntu.com:6969/announce', info_hash, peer_id))
|
||||||
print(udp_announce('udp://tracker.openbittorrent.com:80', info_hash, peer_id))
|
print(udp_get_peers('udp://tracker.openbittorrent.com:80', info_hash, peer_id))
|
||||||
|
|
Loading…
Reference in New Issue