I am using ( Client )REQ->ROUTER
(Router)<-ROUTER
(Worker) Socket-scheme.
I could able to send the Client request to the particular worker, but unable to send the response back to Client and as it's a REQ
socket and hence the client hangs waiting for a response.
Tried a lot but failed to resolve.
Client.cpp
#include "zhelpers.hpp"
#include <string>
int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t requester(context, ZMQ_REQ);
requester.setsockopt(ZMQ_IDENTITY,"M");
requester.connect("tcp://localhost:5559");
for( int request = 0 ; request < 10 ; request++) {
std::string cmd;
std::cin>>cmd;
s_sendmore (requester, "B");//addressing workers
s_sendmore (requester, "");
s_send (requester, cmd);
s_dump(requester);
}
}
router.cpp
#include "zhelpers.hpp"
int main(int argc, char *argv[]) {
zmq::context_t context(1);
zmq::socket_t frontend(context, ZMQ_ROUTER);
frontend.setsockopt(ZMQ_ROUTER_MANDATORY, 1);
frontend.bind("tcp://*:5559");
zmq::pollitem_t items[] = {
{frontend, 0, ZMQ_POLLIN, 0}
};
while (1) {
zmq::message_t source;
zmq::message_t empty1;
zmq::message_t destination;
zmq::message_t empty2;
zmq::message_t message;
int more;
zmq::poll(&items[0], 1, -1);
std::cout << "DEBUG MSGS NOT PRINTING";// Another issue
if (items[0].revents & ZMQ_POLLIN) {
while (1) {
// Process all parts of the message
frontend.recv(&source);
frontend.recv(&empty1);
frontend.recv(&destination);
frontend.recv(&empty2);
frontend.recv(&message);
size_t more_size = sizeof(more);
frontend.getsockopt(ZMQ_RCVMORE, &more, &more_size);
frontend.send(destination, ZMQ_SNDMORE);
frontend.send(empty1, ZMQ_SNDMORE);
frontend.send(source, ZMQ_SNDMORE);
frontend.send(empty2, ZMQ_SNDMORE);
frontend.send(message);
if (!more)
break;
}}}
return 0;
}
Also the cout
statements in router.cpp
do not print, Reason unknown ?
worker.cpp
#include "zhelpers.hpp"
int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t responder(context, ZMQ_ROUTER);
responder.setsockopt(ZMQ_IDENTITY, "B", 1);
responder.connect("tcp://localhost:5559");
while(1)
{
s_dump(responder);
sleep (1);
s_sendmore (responder, "B");
s_sendmore (responder, "");
s_sendmore (responder, "M");
s_sendmore (responder, "");
s_send (responder, "FromSlaveB");
}}
I'm on Ubuntu 16.04 and Current 0MQ version is 4.0.5