Send / receive wrapper for System.Net.Sockets
Review


Property Connected is not thread-safe. Use Interlocked.CompareExchange to get the connection atomically.
Events DataReceived and Disconnected are never cleared. This will cause a memory leak. Implement a Clear function and/or implement IDisposable.
Methods Send, Disconnect, EndReceive are not thread-safe. Consider using a mutex/lock.
Checking fullyReceived on receivedLength == header.DataSize is naive and can be broken. TCP messages can be sent in several packets. Use an internal buffer instead. Also, receivedLength = 0 is a clean way of determining no more data is available.
Catching SocketException blindly is a code-smell.