我正在尝试创建一个简单的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
)connect
和bind
send
之后bind
编辑: 当我使用tcp时,它也可以正常工作。
答案 0 :(得分:1)
似乎这仍然是inproc的限制。 ZMQ-Guide表示,对于inproc套接字bind
必须在connect
之前调用。此限制在版本4.0.0中已得到修复,但显然不适用于REQ套接字。
答案 1 :(得分:0)
inproc
传输类 连接inproc
套接字
使用带有 zmq_connect()
传输的inproc
将套接字连接到对等 地址 (*)时, 端点 应解释为(*)任意字符串,用于标识&lt; 名称&gt; 连接到。
&lt; 名称&gt; 必须先前已创建 ,方法是将分配给 at作为连接套接字的 相同 ØMQ上下文中的至少一个套接字。
在您的代码段和inproc://test
实例之前使用requestSocket
&lt; 名称&gt; 创建另一个“特技”-socket,现在是同一个ZMQ_Context引擎盖下的第二个套接字,应该按照规范和你的期望工作。
在模拟代码和模拟代码中检测+处理错误状态并将其作为一个原则处理绝对不是一个坏习惯。生产代码中的内容越多。