static void server_message (client_t *self) { if (self->reply) fmq_msg_destroy (&self->reply); self->reply = fmq_msg_recv (self->dealer); if (!self->reply) return; // Interrupted; do nothing if (fmq_msg_id (self->reply) == FMQ_MSG_SRSLY) client_execute (self, srsly_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_RTFM) client_execute (self, rtfm_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_ORLY) client_execute (self, orly_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_OHAI_OK) client_execute (self, ohai_ok_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_CHEEZBURGER) client_execute (self, cheezburger_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_HUGZ) client_execute (self, hugz_event); else if (fmq_msg_id (self->reply) == FMQ_MSG_ICANHAZ_OK) client_execute (self, icanhaz_ok_event); // Any input from server counts as activity self->expires_at = zclock_time () + self->heartbeat * 2; }
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); }
int fmq_server_test (bool verbose) { printf (" * fmq_server: "); fflush (stdout); zctx_t *ctx = zctx_new (); fmq_server_t *self; void *dealer = zsocket_new (ctx, ZMQ_DEALER); zsocket_set_rcvtimeo (dealer, 2000); zsocket_connect (dealer, "tcp://localhost:5670"); fmq_msg_t *request, *reply; // Run selftest using '' configuration self = fmq_server_new (); assert (self); int port = fmq_server_bind (self, "tcp://*:5670"); assert (port == 5670); request = fmq_msg_new (FMQ_MSG_OHAI); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_SRSLY); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_ICANHAZ); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_RTFM); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_NOM); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_RTFM); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_HUGZ); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_RTFM); fmq_msg_destroy (&reply); fmq_server_destroy (&self); // Run selftest using 'anonymous.cfg' configuration self = fmq_server_new (); assert (self); fmq_server_configure (self, "anonymous.cfg"); port = fmq_server_bind (self, "tcp://*:5670"); assert (port == 5670); request = fmq_msg_new (FMQ_MSG_OHAI); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_OHAI_OK); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_NOM); fmq_msg_send (&request, dealer); request = fmq_msg_new (FMQ_MSG_HUGZ); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_HUGZ_OK); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_YARLY); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_RTFM); fmq_msg_destroy (&reply); fmq_server_destroy (&self); // Run selftest using 'server_test.cfg' configuration self = fmq_server_new (); assert (self); fmq_server_configure (self, "server_test.cfg"); port = fmq_server_bind (self, "tcp://*:5670"); assert (port == 5670); request = fmq_msg_new (FMQ_MSG_OHAI); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_ORLY); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_YARLY); fmq_msg_set_mechanism (request, "PLAIN"); fmq_msg_set_response (request, fmq_sasl_plain_encode ("guest", "guest")); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_OHAI_OK); fmq_msg_destroy (&reply); request = fmq_msg_new (FMQ_MSG_NOM); fmq_msg_send (&request, dealer); request = fmq_msg_new (FMQ_MSG_HUGZ); fmq_msg_send (&request, dealer); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_HUGZ_OK); fmq_msg_destroy (&reply); reply = fmq_msg_recv (dealer); assert (reply); assert (fmq_msg_id (reply) == FMQ_MSG_HUGZ); fmq_msg_destroy (&reply); fmq_server_destroy (&self); zctx_destroy (&ctx); // @end // No clean way to wait for a background thread to exit // Under valgrind this will randomly show as leakage // Reduce this by giving server thread time to exit zclock_sleep (200); printf ("OK\n"); return 0; }