c - 如何实现zmsg_recv_nowait?

标签 c zeromq

CZMQ 库为 zstrzframe 类提供 nowait 选项(zstr_recv_nowait()zframe_recv_nowait ()),但没有像 zmsg_recv_nowait() 这样的东西。有什么解决办法吗?而不是使用带有 ZMQ_DONTWAIT 标志的 zmq_msg_recv 。我的代码是:

zmq_pollitem_t items[] = { {sock, 0, ZMQ_POLLIN, 0} };
zmq_poll(items, 1, 10);
/* now receive all pending messages */
while (1) {
    zmsg_t *msg = zmsg_recv(sock); /* this will block after the last message received */
    /* consume message here */
}
/* sending bunch of messages */

我正在执行异步REQ/REP。发送多个请求,然后在准备好时接收回复。此代码将阻止我的应用程序。另外,对我来说,执行一个 zmq_poll、接收一条消息等等似乎很难看...因为当 zmq_poll 返回时,其他回复已经到达。

最佳答案

将轮询代码放入循环中。对一个套接字使用 poll 就可以了。

一个例子可能会有所帮助:

while (1) {
    /* now receive all pending messages */
    zmq_pollitem_t items[] = { {sock, 0, ZMQ_POLLIN, 0} };

    /* this will block for 10msec, ZMQ_POLL_MSEC is for compatibility for v2.2 */
    int rc = zmq_poll(items, 1, 10 * ZMQ_POLL_MSEC );
    if (rc == -1)
      break; // some error occured, check errno...

    if (items [0].revents & ZMQ_POLLIN) {
      /* there's something to receive */
      zmsg_t *msg = zmsg_recv(sock);
    }

    /* sending bunch of messages */
}

关于c - 如何实现zmsg_recv_nowait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14870251/

相关文章:

c - double to int in c

linux - 带有 RT Linux(RT-PREEMPT 补丁)的 ZeroMQ 是实时的吗?

php - 为什么我不应该基于 ZeroMQ 构建 web 服务?

c - 垃圾收集器会在这里做什么?

Python ZeroMQ PUSH/PULL——丢失消息?

javascript - 如何在运行时检查此 TypeScript 代码中的 instanceof?

windows - 为什么 ZeroMQ PGM 多播接收卡在中间并且没有进一步接收数据包

c - 该函数不返回任何值

c - 将完整操作系统编写为 UEFI 应用程序的现实性

c - 多线程应用程序中的 ncurses