http://www.codeproject.com/Articles/1608/Asynchronous-socket-communication