mercredi 5 décembre 2018

Do ZMQ_ROUTER and ZMQ_DEALER need delimiter empty string?

I have question about ZeroMQ Dealer and Router sockets. I have an architecture like this below:

enter image description here

Dealer1 and Dealer2 has ids and I set it with this:

m_socket->setsockopt(ZMQ_IDENTITY, socketId.data(), socketId.size());

I am sending messages from Dealer1 socket to Dealer3 via Router socket. It is a zmq::proxy

zmq::context_t context(1);
zmq::socket_t frontEnd(context, ZMQ_ROUTER);
frontEnd.bind(socketAddress);
zmq::socket_t backend(context, ZMQ_DEALER);
backend.bind("inproc://mainSocket");
zmq::proxy(frontEnd, backend, nullptr);

When I send message to Dealer3 from Dealer1 like this, everything is okey:

 std::string ReceiveReplyString()
 {
    zmq::message_t message;
    int ret = m_socket->recv(&message);
    if (ret)
    {
       return std::string(static_cast<char*>(message.data()), message.size());
    }
    else
    {
       throw zmq::error_t();
    }    
}

const std::string emptyString = "";
zmq::message_t request(dataString.data(), dataString.size());
int ret = m_socket->send(request);
if (ret)
{
   m_replyString = ReceiveReplyString();
   //Sending empty string as delimeter
   zmq::message_t delimeter(emptyString.size());
   memcpy(delimeter.data(), emptyString.data(), emptyString.size());
   m_socket->send(delimeter);
   }
   else
   {
      throw zmq::error_t();
   }
}

I can send multiple messages but If I send messages without empty string after sending real message, I can not send or get any message after first one.

Aucun commentaire:

Enregistrer un commentaire