[zeromq-dev] ZMQ_RCVMORE Set, But recv() Blocks

Gregory Szorc gregory.szorc at gmail.com
Sat Nov 27 23:36:00 CET 2010

I have an issue with recv() blocking when ZMQ_RCVMORE is set that I think 
might be a bug. Before I file a bug or send a full repro case, I thought I'd 
run it by the community to see if I have my head screwed on right.

The gist of my code is as follows:

   zmq::message_t msg;
   int64 more;
   size_t moresz = sizeof(more);

   zmq::poll(&pollitems[0], N, 0);

    if (pollitems[0].revents & ZMQ_POLLIN) {
        while (true) {
            // false only return if EAGAIN is set, which is impossibe since 
we are in blocking mode
            this->sock->recv(&msg, 0);

            moresz = sizeof(more);
            // all errors on getsockopt() are converted to exceptions in 
C++, so don't need to check bool (at least in this example)
            this->sock->getsockopt(ZMQ_RCVMORE, &more, &moresz);
            if (!more) break;

What I'm seeing is a handful of messages come through on the socket (an 
inproc:// bound to this thread with data coming from other threads - yes 
bind() is being called before connect()). Eventually, getsockopt() says 
RCVMORE is set, but when I call recv(), it blocks. A stack trace shows it is 
stuck in libc's recv().

I can get around the problem by setting NOBLOCK in the recv() flags, but 
that doesn't change the fact that the socket says there is a message to be 
read, but it blocks forever trying to read it. It is my understanding that 
if RCVMORE is set (or a revents & POLLIN for that matter), a blocking call 
to recv() should always return immediately. Is this not true? If so, what 
conditions can cause this to happen? Are they documented?

The condition is present on Linux (2.6.35 x86_64), but not Windows (although 
the difference could be attributed to my program, not 0MQ). I can reproduce 
on 2.0.10 and master (325dd2f0914de502ae7687f94927fa98c20380c9).

Like I said, I can likely boil this down to a full repro, but it will take 
some time and I'd prefer to not spend time doing it unless someone thinks 
this might be a legit bug instead of a stupid user problem.

gregory.szorc at gmail.com 

More information about the zeromq-dev mailing list