zmq-cpp:recv()在设置ZMQ_DONTWAIT时等待数据

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)