On another note, you could use something I'm thinking as a cookie/token to maintain where a given client is within a given transaction. Then keep data (whether in FIFOs, DBs, or plain files) on what needs to go where based on the token. This could alleviate some issues, as you move to a state machine as opposed to dealing strictly with transactions.
Thought process:
Client connects
if client->token {
check datasource(token);
if send_to_client {
send_to_client
clear_data_set
}
if client->new_cmd {
do_something
}
} else {
client->token(new);
if client->new_cmd {
do_something
}
}
Then maintain a seperate process which sits and checks for server->server communication requests, handles that, and updates the data source appropriatly.
A breakdown that way seems slightly less complicated to me, while residing within what you want to do. Also you can update the client or server piece without a major rewrite of the entire app
/* And the Creator, against his better judgement, wrote man.c */