2013-02-14 62 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