This is a developer scratch file, which contains thoughts during the development process.

OK	registration function
OK	function to save registered nodes
OK	function to load registered nodes file

OK	function for loading config file

OK	load hashes into linked list
OK	anonymize hashes
OK	save hashes to working file

OK	generate work, save work, load work

OK	linked list for work units
OK	function for loading work units
OK	function for saving work states
OK	function for generating work
OK	save the newest work unit to john.rec on genwork startup

OK	function for requesting work
OK	function for submitting cracked hash/plaintext pairs
OK	remove cracked accounts from the working hash file
OK	function for submitting completed units

---
function to reset node stats (when loading new hash files)
server will maintain "first seen" time for each node, and compute rate based on this.. 
rate computed when showing stats, based on
secs = now - firstseen 
cryptspersec = (completednodes * nodesize) / secs
total cryptspersec = cryptspersec of each node added together
---

function for server logging

node speed calculator (based on time to complete units)
overall speed calculator (based on units completed, unit size, time taken)

remove checksum function from john
verify cracked hashes
blacklist nodes who submit invalid results

server connection timing out

client:

OK	connection/read loop
OK	configuration parser
OK	socket connector
OK	node registration
OK	authentication details loading/saving
OK	node authentication
OK	hash downloader
OK	unit downloader
OK	unit loader
OK	unit saver
OK	unit uploader
OK	unit processor

improvements:

OK		periodic saving (server)
OK		implement socket timeouts on server & client, runtime configurable
function to delete a node
runtime configuration of socket timeout variables (see above)
runtime configuration of john binary name (default to john)
runtime configuration of dnetj.pass file (default to dnetj.pass)
ability for the client to update its local user/pass if the server changes
ability to pause/resume multiple jobs, by switching hashes/units files but keeping nodes
runtime debug mode
prevent the client from asking for nodes until it has downloaded the hash
server command to reassign units
individual acks, per id (hashes, units)
slower sending, wait for the ack then check for more and resend (combine with above)
multi threaded resolver, store resolved address in list
update stats output to show number of units in cache
make client drop connections properly
* check * does john continue working properly when it crosses the 32bit .lo boundary
if no maxunits specified, download a single unit and work out the units/hour
OK		unit resend - client demands the server re-send all outstanding units (use when node full, flush and request resend)
keep a non-resettable tally of total nodes completed
multithreaded client -seperate network thread which triggers when spare units hits a low threshold, multiple crackers for multi cpu boxes
keep a tally of average time between checkins, so you know when to expect a node to reconnect
fix bug in server stats calculation
