Hi

At the bottom of this message you may find a simple test program for
DEALER<->ROUTER socket pair.
It sends test message from dealer to router and then back.
It works fine with 3.0.x, but with 3.1 HEAD blocks on second
zmq_recvmsg() ,please see inline comment.

My test platform Win7, build target - Win32/Debug.

Is something changed in DEALER-ROUTER behavior or it is just a bug?!

Regards
Alexander


#include "zmq.h"

int main(int argc, char* argv[])
{
        void* context1 = zmq_init( 1 );
        void* dealer = zmq_socket( context1, ZMQ_DEALER );
        zmq_connect( dealer, "tcp://127.0.0.1:5555" );

        void* context2 = zmq_init( 1 );
        void* router = zmq_socket( context2, ZMQ_ROUTER );
        zmq_bind( router, "tcp://*:5555" );
        {
                zmq_msg_t msg;
                zmq_msg_init_size( &msg, 16 );
                memset( zmq_msg_data( &msg ), 1, 16 );
                zmq_sendmsg( dealer, &msg, 0 );
                zmq_msg_close( &msg );
        }
        zmq_pollitem_t items [] = 
        {
                { router, 0, ZMQ_POLLIN, 0 }
        };
        zmq_poll( items, 1, 1500 ); 
        if( items [0].revents & ZMQ_POLLIN )
        {
                zmq_msg_t msg;

                // first message should be "reply-address"
                zmq_msg_init( &msg );
                zmq_recvmsg( router, &msg, 0 );
                size_t size = zmq_msg_size( &msg );
                zmq_sendmsg( router, &msg, ZMQ_SNDMORE );
                zmq_msg_close( &msg );

                // we always expect second message immediately
                zmq_msg_init( &msg );
                zmq_recvmsg( router, &msg, 0 ); // blocked here!!
                zmq_msg_close( &msg );
                zmq_msg_init_size( &msg, 16 );
                memset( zmq_msg_data( &msg ), 2, 16 );
                zmq_sendmsg( router, &msg, 0 );
                zmq_msg_close( &msg );
        }
        {
                zmq_pollitem_t items [] = 
                {
                        { dealer, 0, ZMQ_POLLIN, 0 }
                };
                zmq_poll( items, 1, 1500 ); 
                if( items [0].revents & ZMQ_POLLIN )
                {
                        zmq_msg_t msg;
                        zmq_msg_init( &msg );
                        zmq_recvmsg( dealer, &msg, 0 );
                        zmq_msg_close( &msg );
                }
        }
        zmq_close( dealer );
        zmq_close( router );

        zmq_term( context1 );
        zmq_term( context2 );

}

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to