当REQ-Socket没有连接对等体时,ZMQ消息丢失

时间:2014-08-11 11:28:39

标签: c++ zeromq

我正在尝试创建一个简单的ZMQ REQ-Socket,它连接到REP-Socket,然后发送请求。

http://rfc.zeromq.org/spec:28处的规范说REQ-Socket

  

如果没有,则在发送时阻止,或者返回合适的错误   连接的同伴

我尝试使用此代码:

#include <zmq.hpp>
zmq::context_t context;
zmq::socket_t requestSocket(context, ZMQ_REQ);
requestSocket.connect("inproc://test");
requestSocket.send(0, 0);

但是send不会阻止并且不会抛出错误。当我之后创建一个REP-Socket时,它没有收到消息:

zmq::socket_t replySocket(context, ZMQ_REP);
replySocket.bind("inproc://test");
zmq::message_t message;
replySocket.recv(&message); //hangs

Missing-Message-Problem-Solver(http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver)说

  

循环发送和接收并检查返回代码

send不会抛出错误(zmq_send返回0)。那么这样做的正确方法是什么?

我正在使用ZMQ 4.0.3

注: 如果我

,上面的例子工作正常
  • 使用其他套接字类型(例如ZMQ_PAIR
  • 或交换connectbind
  • send 之后
  • bind

编辑: 当我使用tcp时,它也可以正常工作。

2 个答案:

答案 0 :(得分:1)

似乎这仍然是inproc的限制。 ZMQ-Guide表示,对于inproc套接字bind必须在connect之前调用。此限制在版本4.0.0中已得到修复,但显然不适用于REQ套接字。

答案 1 :(得分:0)

I / O-Thread-less inproc传输类

的传输特定步骤

连接inproc套接字

使用带有 zmq_connect() 传输的inproc将套接字连接到对等 地址 (*)时, 端点 应解释为(*)任意字符串,用于标识&lt; 名称&gt; 连接到。

&lt; 名称&gt; 必须先前已创建 ,方法是将分配给 at作为连接套接字的 相同 ØMQ上下文中的至少一个套接字

在您的代码段和inproc://test实例之前使用requestSocket &lt; 名称&gt; 创建另一个“特技”-socket,现在是同一个ZMQ_Context引擎盖下的第二个套接字,应该按照规范和你的期望工作。


经验法则

在模拟代码和模拟代码中检测+处理错误状态并将其作为一个原则处理绝对不是一个坏习惯。生产代码中的内容越多。