http://www.emoticode.net/c-sharp/asynchronous-server-socket-example.html