我对ZeroMQ Dealer和路由器套接字有疑问。我的架构如下:
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();
}
}
我可以发送多封邮件,但是如果在发送真实邮件后发送不带空字符串的邮件,则在第一封邮件之后我将无法发送或接收任何邮件。
答案 0 :(得分:-1)
从zmq文档中获取:
ZMQ_DEALER类型的套接字是用于扩展的高级模式 请求/回复套接字。发送的每条消息都是循环轮询的 连接的同伴
经销商在连接的套接字之间使用轮询发送消息。 这意味着发牌人(中间)将第一个消息发送到Dealer3,然后将第二条消息发送到Dealer4,然后将第三条消息发送到Dealer3。