2013-02-14 99 views
0

CZMQ库提供nowait选项zstrzframe类(zstr_recv_nowait()zframe_recv_nowait()),但没有什么像zmsg_recv_nowait()。有没有解决方法?而不是使用zmq_msg_recvZMQ_DONTWAIT标志。我的代码是:如何实现zmsg_recv_nowait?

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返回时,其他答复已经到达。

回答

2

将轮询代码放入循环中。使用轮询一个套接字很好。

一个例子可能会有帮助:

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 */ 
} 
+1

为了澄清,使用zmq_poll检查时,在插槽中安装的输入,然后只准备插座的recv。 NOWAIT选项是丑陋的,因为它意味着你的代码是手动循环,睡眠等。zmq_poll是一个更清洁的方法。指南有很多这方面的例子。 – 2013-02-17 23:26:35