ZMQ_ROUTER和ZMQ_DEALER是否需要定界符空字符串?

时间:2018-12-05 17:03:17

标签: c++ sockets c++11 zeromq

我对ZeroMQ Dealer和路由器套接字有疑问。我的架构如下:

enter image description here

Dealer1和Dealer2具有ID,我用它来设置它:

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

我正在通过路由器套接字将消息从Dealer1套接字发送到Dealer3。这是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);

当我像这样从Dealer1向Dealer3发送消息时,一切都很好:

 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();
   }
}

我可以发送多封邮件,但是如果在发送真实邮件后发送不带空字符串的邮件,则在第一封邮件之后我将无法发送或接收任何邮件。

1 个答案:

答案 0 :(得分:-1)

从zmq文档中获取:

  

ZMQ_DEALER类型的套接字是用于扩展的高级模式   请求/回复套接字。发送的每条消息都是循环轮询的   连接的同伴

经销商在连接的套接字之间使用轮询发送消息。 这意味着发牌人(中间)将第一个消息发送到Dealer3,然后将第二条消息发送到Dealer4,然后将第三条消息发送到Dealer3。