And already it's becomming a fucking mess.
A socket can be killed from both sides of the socket manager - the network layer by the client disconnecting, and the API layer but the code calling CSocket::Disconnect(). I'm already having problems trying to get the code to nicely handle a client disconnecting. I can't be bothered trying to explain it, but basically I can't kill a socket without all of it's IO events being flushed and stuff.
Oh shit it, I'm going to get drunk.