Ovako napamet, ako button prima event, taj poziv mora biti prosledjen preko Invoke mehanizma, zato sto .NET GUI kontrole mogu da primaju evente iskljucivo iz svog thread space-a (nije dozvoljen tzv. cross threading). Eventi iz TCP kanala mogu biti posebno nezgodni.
http://www.codeproject.com/KB/cs/begininvoke.aspx
U svakom slucaju, uhvati exception kako je Peka rekao i postuj, pa cemo videti.
Takodje, u C# nema neke narocite potrebe da se radi direktno sa Socket objektima, postoje klase koje omogucavaju komunikaciju na znatno visem nivou. Pogledaj na CodeProject, npr.
http://www.codeproject.com/KB/IP/csremoteevents1.aspx
mi se cini solidno napisan clanak.
A mozes mi poslati tvoj mail, pa cu ti poslati jedan prost clinet - server projekat, da imas osnovu.