// Client hash function that checks if client is alive static int client_ping (const char *key, void *client, void *argument) { client_t *self = (client_t *) client; // Expire client if it's not answered us in a while if (zclock_time () >= self->expires_at && self->expires_at) { // In case dialog doesn't handle expired_event by destroying // client, set expires_at to zero to prevent busy looping self->expires_at = 0; server_client_execute ((server_t *) argument, self, expired_event); } else // Check whether to send heartbeat to client if (zclock_time () >= self->heartbeat_at) { server_client_execute ((server_t *) argument, self, heartbeat_event); self->heartbeat_at = zclock_time () + self->heartbeat; } return 0; }
static void server_client_message (server_t *self) { fmq_msg_t *request = fmq_msg_recv (self->router); if (!request) return; // Interrupted; do nothing char *hashkey = zframe_strhex (fmq_msg_address (request)); client_t *client = (client_t *) zhash_lookup (self->clients, hashkey); if (client == NULL) { client = client_new (fmq_msg_address (request)); client->heartbeat = self->heartbeat; client->router = self->router; zhash_insert (self->clients, hashkey, client); zhash_freefn (self->clients, hashkey, client_free); } free (hashkey); if (client->request) fmq_msg_destroy (&client->request); client->request = request; // Any input from client counts as heartbeat client->heartbeat_at = zclock_time () + client->heartbeat; // Any input from client counts as activity client->expires_at = zclock_time () + client->heartbeat * 3; if (fmq_msg_id (request) == FMQ_MSG_OHAI) server_client_execute (self, client, ohai_event); else if (fmq_msg_id (request) == FMQ_MSG_ICANHAZ) server_client_execute (self, client, icanhaz_event); else if (fmq_msg_id (request) == FMQ_MSG_NOM) server_client_execute (self, client, nom_event); else if (fmq_msg_id (request) == FMQ_MSG_HUGZ) server_client_execute (self, client, hugz_event); else if (fmq_msg_id (request) == FMQ_MSG_KTHXBAI) server_client_execute (self, client, kthxbai_event); }
// Client hash function that checks if client is alive static int client_dispatch (const char *key, void *client, void *server) { server_client_execute ((server_t *) server, (client_t *) client, dispatch_event); return 0; }