I've run into this in the past. Not lately, but I have. And I thought about it so I'm bringing it up again.
In your implementation of the communication protocol, is there any way you could upon connect, specify what "features" the server has available and enable/disable those features on the client for a 'graceful downgrade'? (Maybe also specify a protocol version?)
I ask, because on top of that it would be cool to auto-update client versions like google chrome does. (Download in the background in a staggered-release fashon, store the EXE, then replace it upon application close so when the user opens up the next time, they are on the new version)
Both of these features together would allow graceful upgrading, while allowing the user to use whatever version he wants (My problem is that I've had issues with people being too lazy to update the client software.)
In the reverse, this could allow the server software to be upgraded, without worrying about the client needing to (Of course this means every time a major communications change is put in place, you'll need a 'downgrade' copy so that the server can communicate with the old client.)
I know it would probably be a painful overhaul to do now, but maybe keep these suggestions in mind for later while building new code? That way as you fix one thing, or overwrite some old code with a new function, you can incorporate the changes slowly allowing for a full switch over later.
