Beispiel #1
0
mdcli_t *
mdcli_new (char *broker, int verbose)
{
    assert (broker);

    mdcli_t *self = (mdcli_t *) zmalloc (sizeof (mdcli_t));
    self->ctx = zctx_new ();
    self->broker = strdup (broker);
    self->verbose = verbose;
    self->timeout = 2500;           //  msecs

    s_mdcli_connect_to_broker (self);
    return self;
}
Beispiel #2
0
mdcli_t *
mdcli_new (char *broker, int verbose)
{
    assert (broker);
    s_version_assert (2, 1);

    mdcli_t *self = (mdcli_t *) calloc (1, sizeof (mdcli_t));
    self->broker = strdup (broker);
    self->context = zmq_init (1);
    self->verbose = verbose;
    self->timeout = 2500;           //  msecs

    s_catch_signals ();
    s_mdcli_connect_to_broker (self);
    return self;
}
Beispiel #3
0
zmsg_t *
mdcli_send (mdcli_t *self, char *service, zmsg_t **request_p)
{
    assert (self);
    assert (request_p);
    zmsg_t *request = *request_p;

    //  Prefix request with protocol frames
    //  Frame 1: "MDPCxy" (six bytes, MDP/Client x.y)
    //  Frame 2: Service name (printable string)
    zmsg_push (request, service);
    zmsg_push (request, MDPC_CLIENT);
    if (self->verbose) {
        s_console ("I: send request to '%s' service:", service);
        zmsg_dump (request);
    }

    int retries_left = self->retries;
    while (retries_left && !s_interrupted) {
        zmsg_t *msg = zmsg_dup (request);
        zmsg_send (&msg, self->client);

        while (!s_interrupted) {
            //  Poll socket for a reply, with timeout
            zmq_pollitem_t items [] = { 
                { self->client, 0, ZMQ_POLLIN, 0 } };
            zmq_poll (items, 1, self->timeout * 1000);

            //  If we got a reply, process it
            if (items [0].revents & ZMQ_POLLIN) {
                zmsg_t *msg = zmsg_recv (self->client);
                if (self->verbose) {
                    s_console ("I: received reply:");
                    zmsg_dump (msg);
                }
                //  Don't try to handle errors, just assert noisily
                assert (zmsg_parts (msg) >= 3);

                char *header = zmsg_pop (msg);
                assert (streq (header, MDPC_CLIENT));
                free (header);

                char *reply_service = zmsg_pop (msg);
                assert (streq (reply_service, service));
                free (reply_service);

                zmsg_destroy (&request);
                return msg;     //  Success
            }
            else
            if (--retries_left) {
                if (self->verbose)
                    s_console ("W: no reply, reconnecting...");
                //  Reconnect, and resend message
                s_mdcli_connect_to_broker (self);
                zmsg_t *msg = zmsg_dup (request);
                zmsg_send (&msg, self->client);
            }
            else {
                if (self->verbose)
                    s_console ("W: permanent error, abandoning request");
                break;          //  Give up
            }
        }
    }
    if (s_interrupted)
        printf ("W: interrupt received, killing client...\n");
    zmsg_destroy (&request);
    return NULL;
}
Beispiel #4
0
zmsg_t *
mdcli_send(mdcli_t *self, char *service, zmsg_t **request_p)
{
	assert(self);
	assert(request_p);
	zmsg_t *request = *request_p;

	zmsg_pushstr(request, service);
	zmsg_pushstr(request, MDPC_CLIENT);
	if (self->verbose){
		zclock_log("I: send request to '%s' service:", service);
		zmsg_dump(request);
	}
	int retries_left = self->retries;
	while (retries_left && !zctx_interrupted){
		zmsg_t *msg = zmsg_dup(request);
		zmsg_send(&msg, self->client);

		zmq_pollitem_t items [] = {
			{self->client, 0, ZMQ_POLLIN, 0}
		};

		int rc = zmq_poll(items, 1, self->timeout * ZMQ_POLL_MSEC);
		if (rc == -1)
			break;

		if (items[0].revents & ZMQ_POLLIN){
			zmsg_t *msg = zmsg_recv(self->client);
			if (self->verbose){
				zclock_log("I: received reply:");
				zmsg_dump(msg);
			}

			assert(zmsg_size(msg) >= 3);

			zframe_t *header = zmsg_pop(msg);
			assert(zframe_streq(header, MDPC_CLIENT));
			zframe_destroy(&header);

			zframe_t *reply_service = zmsg_pop(msg);
			assert(zframe_streq(reply_service, service));
			zframe_destroy(&reply_service);

			zmsg_destroy(&request);
			return msg;
		}
		else 
		if (--retries_left){
			if (self->verbose)
				zclock_log("W: no reply, reconnecting...");
			s_mdcli_connect_to_broker(self);
		}
		else {
			if (self->verbose)
				zclock_log("W: permanent error, abandoning");
			break;
		}
	}
	if (zctx_interrupted)
		printf("W: interrupt received, killing client...\n");
	zmsg_destroy(&request);
	return NULL;
}