Go to file
Fred Stober 06dd22bec7 Rewrite of KRPC / DHT classes
KRPC: Using own socket wrapper to provide needed (non-)/blocking behaviour of send/recv
DHT: Improved handling of malformed messages
Improved granularity of logging in DHT / KRPC and utils
Small performance fixes
Replaced lambdas by functions to facilitate code instrumentation
Decreased the shutdown time for KRPC nodes
bencode python 3
crc32 python 3
dht python 3
2015-11-27 04:19:40 +01:00
.gitignore Initial implementation of the KRPC protocol 2015-04-09 18:38:13 +02:00
LICENSE Initial implementation of the KRPC protocol 2015-04-09 18:38:13 +02:00
README.md Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00
bencode.py Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00
crc32c.py Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00
dht.py Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00
krpc.py Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00
utils.py Rewrite of KRPC / DHT classes 2015-11-27 04:19:40 +01:00

README.md

tiny Bittorrent client

The goal is to supply an easy to use and simple to understand implementation of the BitTorrent specifications in python with no external dependencies except for the python standard library.

The implementation is spread over several files, each implementing a single component.

  • krpc.py - implements the basic UDP Kademila-RPC protocol layer
  • dht.py - contains the code for accessing the Mainline DHT using KRPC

KRPC Implementation

The KRPCPeer only exposes three methods:

  • init((host, port), query_handler) That takes the (host, port) tuple where it should listen and the second argument is the function that processes incoming messages.
  • shutdown() Shutdown of all threads and connections of the KRPC peer.
  • send_krpc_query((host, port), method, **kwargs) This method sends a query to a remote host specified by a (host, pool) tuple. The name and arguments to call on the remote host is given as well. An async result holder is returned, that allows to wait for a reply.

DHT Implementation

The DHT class offers the 4 DHT methods described in BEP #5 - each takes the remote host in the form of a (host, port) tuple as the first argument. The other arguments are the same as described in the specification. They all return an async result holder with the unprocessed data from the remote host:

  • ping(target_connection, sender_id)
  • find_node(target_connection, sender_id, search_id)
  • get_peers(target_connection, sender_id, info_hash)
  • announce_peer(target_connection, sender_id, info_hash, port, token, implied_port = None)

In addition, some additional helper functions are made available - these functions take care of updating the routing table and are blocking calls with a user specified timeout:

  • dht_ping(connection, timeout = 5) Returns the complete result dictionary of the call.
  • dht_find_node(search_id, timeout = 5, retries = 2) Searches iteratively for nodes with the given id and yields the connection tuple if found.
  • dht_get_peers(info_hash, timeout = 5, retries = 2) Searches iteratively for nodes with the given info_hash and yields the connection tuple if found.
  • dht_announce_peer(info_hash, implied_port = 1) Registers the availabilty of the info_hash on this node to all peers that supplied a token while searching for it.

The final three functions are used to start and shutdown the local DHT Peer and allow access to the discovered external connection infos:

  • init(listen_connection, bootstrap_connection = ('router.bittorrent.com', 6881), setup = {'report_t': 10, 'check_t': 30, 'check_N': 10, 'discover_t': 180}) The constructor needs to know what address and port to listen on and which node to use as a bootstrap node. The run interval and some other parameters of the maintainance threads can be configured as well.
  • shutdown() Start shutdown of the local DHT peer and all associated maintainance threads.
  • get_external_connection() Return the discovered external connection infos