This simple piece of code attached was working fine in 3.0 but in 3.1 blocks at line 55.

The program send locally "echo" from client to worker using this topology: DEALER[client]->ROUTER[frontend]->ROUTER[backend]->DEALER[worker]

In 3.1, it seems the worker socket MUST register by sending some data first to the backend before the client can route "echo" to worker.
In 3.0, it was not necessary. A simple connect to backend was sufficient.

Is the 3.1 behaviour the expected behaviour?

thanks,

Benoit
// TestZMQ.cpp : Defines the entry point for the console application.
//

#include <zmq.hpp>
#include <string>
#include <list>

using namespace zmq;
using namespace std;


int main( )
{
        context_t context(1);

        socket_t client(context,ZMQ_DEALER);
        socket_t frontend(context,ZMQ_ROUTER);
        socket_t backend(context,ZMQ_ROUTER);
        socket_t worker(context,ZMQ_DEALER);

        frontend.bind("tcp://*:5555");
        backend.bind("tcp://*:5556");
        const char clientid[] = "client";
        client.setsockopt(ZMQ_IDENTITY,clientid,6);
        client.connect("tcp://localhost:5555");
        const char workerid[] = "worker";
        worker.setsockopt(ZMQ_IDENTITY,workerid,6);
        worker.connect("tcp://localhost:5556");

        char buffer[32] = {0};
        const char message[] = "echo";
        std::list<string> router_frames,worker_frames;
        client.send(message,4);

        int recvmore = 1;
        size_t recvmoresize = sizeof(recvmore);
        while(recvmore)
        {
                size_t size = frontend.recv(buffer,32);
                router_frames.push_back(string(buffer,size));
                frontend.getsockopt(ZMQ_RCVMORE,&recvmore,&recvmoresize);
        }

        //route msg to worker
        router_frames.push_front(string(workerid));
        for (std::list<string>::const_iterator frameIt = router_frames.begin();
frameIt != router_frames.end(); )
        {
                const string &frame = *frameIt;
                backend.send(frame.data(),frame.size(), ++frameIt != 
router_frames.end() ?
ZMQ_SNDMORE : 0 );
        }

        recvmore = 1;
        while(recvmore)
        {
                size_t size = worker.recv(buffer,32);
                worker_frames.push_back(string(buffer,size));
                worker.getsockopt(ZMQ_RCVMORE,&recvmore,&recvmoresize);
        }

        return 0;
}

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

Reply via email to