[zeromq-dev] problem with zmsg_recv_nowait

Arturo S. Garcia artgarcia at gmail.com
Wed Mar 18 14:06:31 CET 2015


Hi All,

I am using czmq-2.2.0, zeromq-4.0.5 and libsodium-1.0.2.

I am tying to send a message using a publisher node and receive it using
*zmsg_recv_nowait*. The thing is that I do not know if I am doing something
wrong... Here is the code:

   - Publiser:

std::string data ("test");
zmsg_t *mess = zmsg_new();
zmsg_addmem(mess, data.c_str(), data.size());
zmsg_send (&mess, _pub);

   - Subscriber:

zmsg_t *message2 = zmsg_recv_nowait (_subs);
if (message2)
{
        zframe_t *content = zmsg_pop (message2);
        // get message
        char* char_msg = zframe_strdup(content);
        data = std::string(char_msg,zframe_size(content));
        printf("Response: '%s'\n", data.c_str());
}

The problem is that I never receive a message in the subscriber. If I
change to *zmsg_recv*, then I am able to receive them. Is it possible that
*zmsg_recv_nowait* is not working properly? or I am using it in a wrong
way? Moreover, changing from *zmsg_recv_nowait* to *zstr_recv_nowait* also
works fine...

I have modified the code of *zmsg_recv_nowait* in* zmsg.c* when the last
message frame is received by including *frames++* because I noticed that
the message was actually received, but discarded becasue the frame counter
is not increased. Is this a mistake or this function was intended to be
used with more than one frame only?

Here is the modified *zmsg_recv_nowait*:
zmsg_t *
zmsg_recv_nowait (void *zocket)
{
    assert (zocket);
    int frames = 0;
    zmsg_t *self = zmsg_new ();
    if (!self)
        return NULL;

    while (true) {
        zframe_t *frame = zframe_recv_nowait (zocket);
        if (!frame) {
            zmsg_destroy (&self);
            break;              //  Interrupted or terminated
        }
        if (zmsg_append (self, &frame)) {
            zmsg_destroy (&self);
            break;
        }
        if (!zsocket_rcvmore (zocket))
       * {*
            *frames++;*
            break;              //  Last message frame
        *}*
        frames++;
    }
    return frames > 0 ? self : NULL;
}

Any ideas? Thanks in advance.

Regards,
Arturo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20150318/0f420564/attachment.htm>


More information about the zeromq-dev mailing list