As soon as on starts doing serious amounts of network programming in C one realises quite quickly why higher level languages are popular! Basically they have a great deal of functionality built in that you soon find yourself wishing that C had a bit more to offer!
First off I would strongly encourage you to look at ZeroMQ (http://zeromq.org/bindings:c) and its C binding. This does a great deal of the horrible donkey work for you in terms of dealing with connections, message demarcation, etc. Plus, it's fast at runtime to; it's quick to develop with and quick to run, the hallmarks of a good library.
ZeroMQ is close to being the perfect sockets library. The only thing it doesn't do yet (AFAIK) is actively monitor the connection to see if it's collapsed - you only find out if you try and send something. You'd have to send your own connection test messages regularly if you wanted to keep a check on the health of the connection.
Secondly I would be encourage you to consider serialisation. As soon as you start having complex data structures which point at allocated memory you'll start getting into complex and difficult territory. When faced with this problem I chose to use ASN.1 for defining and serialising my data structures using the libraries and tools from Objective Systems (http://www.obj-sys.com/index.php). It costs money, takes a bit of getting used to, but I found it extremely worthwhile in terms of time saved in development.
As well as serialisation routines they give you some very handy extras that C doesn't provide. For instance, their code generator will give you routines to copy data types, which is quite handy if that datatype is a structure full of pointers referencing allocated memory.
There's probably some free tools and libraries out there too. A good alternative is Google's protocol buffers which has a C binding (http://code.google.com/p/protobuf-c/).