fra*_*ans 9 c++ nonblocking zeromq
我正在尝试使用ZMQ_DONTWAIT标志使用ZeroMQ实现非阻塞接收方法,但recv()行为就像没有标志时调用:
auto start = std::chrono::steady_clock::now();
auto have_data = sock_->recv(&reply, ZMQ_DONTWAIT);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start).count();
std::cout << duration << " " << have_data;
Run Code Online (Sandbox Code Playgroud)
sock_是一个zmq::socket_t实例化为REQ套接字.
在这种情况下have_data,始终为true,duration无论REP服务器采取何种回复(0到几百毫秒).
请注意,我所说的ZeroMQ的cpp绑定定义在zmq.hpp哪里,recv() 而不是声明zmq.h:
inline bool recv (message_t *msg_, int flags_ = 0);
Run Code Online (Sandbox Code Playgroud)
如果已收到数据,则recv()返回此处true,false如果errno是,则返回EAGAIN
是否有任何先决条件,ZMQ_DONTWAIT使recv()立即回报?
(我使用的是zmq4.1.2版本)
小智 0
您可以查看名为 czmq 的高级 ZeroMQ api。它带有 ZeroMQ 库。它有函数 zstr_recv_nowait() 详细信息:zstr 手册页
例子:
//some code
void *listener = zsocket_new (ctx, ZMQ_SUB); //zctx_t *ctx
//...
while (!zctx_interrupted)
{
char* message = zstr_recv_nowait(listener);
if (message && message[0]!='\0') {
//do some work
}
}
Run Code Online (Sandbox Code Playgroud)