Initial commit
Initial commit.
Readme
Add error handling to synchronous transactions

Error conditions will now propagate through the transaction interface
to the caller in the form of an exception
Improve error reporting and fault tolerance

We tolerate decoding errors and KRPC errors, but we log
everything on the module level logger
Handle errors drom peers that do not specify a transaction id.

Some node software (I'm looking at you LibTorrent!) does not
include a "t" in the error struct. Since we don't know who the
error is for, we can't propagate it back to the synchronous caller.

Instead we log and carry on. The caller will time out.
Log and recover from exceptions in DHT maintentance thread

Don't allow the DHT maintentance thread to die on errors,
log the exception and carry on.
Also, specify levels for both the logger and the handler
in the demo program.
Configure behaviour of the DHT maintenance thread

configuration options to control how often we look for our own
ID, and whether we actively try to discover nodes.
Allow application to define a custom handler

Allow the client application using the DHT object to install
a custom request handler.
Add nodeinfo program

Add a demo program that shows how to add DHT awesomeness to
your application.
Send ID with replies

Actually send ID with all replies, not just PING
Add support for announce_peer requests

Handle and generate announce_peer requests. We don't really keep
any peer administration, so this we are not really adding any actual
functionality, just the appearance of it.
Split nodeinfo logging per id.

Split nodeinfo logging per ID so that we can store the results of
multiple runs without contamination
Alternative login strategy

Try an alternative strategy to log in.
Randomize node id in nodeinfo

Use a random node id for nodeinfo
Update strategy: query nodes that share first byte.
Add version string to requests/replies

Add a version string to out KRPC calls. Fix type in active discovery path.
Demote unknown rpc exception to a regular logged error.

Demote the unknown rpc call exception to a regular (logged)
error. This means we can deal with uTorrent extensions such
as "vote" without choking.
Factor the node ID out of KRPC class

KRPC server does not know about our node id. This logic
is handled at the DHT level.
Log all requests and replies as INFO

Log all incoming requests and their replies as INFO.
Demote self-initiated behaviour to DEBUG