okay,since you want to improve,I will try to write some constructive critique..first of all,you shouldn't be running loops for everything,such as the ping,when it's timed,it's a lot easier to use Timers..in the main,Client.cs part,you're using the example proxy code from drew's example,which I wouldn't,because it was really just for demonstrative purposes,and if you want something performance-effective,you should think of rewriting that part..last thing is,when parsing the packets,you should consider making separate functions for parsing each one,because if you have them all like that laying in there,it makes the code look messy...
but overall,it's a gj so far