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

时间:2015-09-29 12:09:32

标签: c++ zeromq nonblocking

我正在尝试使用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;

sock_zmq::socket_t实例化为REQ套接字。

在这种情况下,have_data始终为true,durationREP服务器回复所需的内容(0到几百毫秒)。

请注意,我在讨论zmq.hpp中定义的ZeroMQ的cpp绑定,其中recv()的声明与zmq.h中的inline bool recv (message_t *msg_, int flags_ = 0); 不同:

recv()

如果已收到数据,则true会返回false,如果errnoEAGAIN则会ZMQ_DONTWAIT

recv()是否有任何先决条件让zmq立即返回?

(我正在使用XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("ABC"); doc.AppendChild(root); for (int i = 0; i < 3; i++) { XmlElement anotherid; XmlElement id; id = doc.CreateElement("DEF"); anotherid = doc.CreateElement("GEH"); anotherid.SetAttribute("Name", ""); anotherid.SetAttribute("Button", ""); root.AppendChild(id); id.AppendChild(anotherid); } doc.Save(@"C:\dummyxml.xml"); 版本4.1.2)

2 个答案:

答案 0 :(得分:2)

是。 ZeroMQ先决条件应予以考虑。)

小调: ZeroMQ允许用户设置setsockopt() with ZMQ_RCVTIMEO == 0或性能合理的值。

然而,主要问题隐藏在 REQ / REP 行为模式中。

如果某个应用程序在 REQ 跳转 ”正确进入状态 [*] < / strong>并等待那些可能已经进入 [REQ]-<Rx> -buffer的任何内容(在此用例中主要是不可能的)或者可能会在稍后到达时间,但有一个问题,因为 REP 交易对手没有回复任何内容,如果没有事先.send()一个.recv(),则必须REQ 1}}的请求。

    ]-<Tx>- - - - - - - - - +                      + - - - - - - - -<Tx>-[
    ]-<Rx>- - - - - - - -+  |                      :  +- - - - - - -<Rx>-[
[REQ]____________________:__|                      :__|__________________[REP]
                         :  |                      :  |
APP.send() ]--->.send()--:->|                      :  |
           ]             |  :\                     :  |
           ]             |  : \____________________:__|>
           ]             |  :                      :  |M
           .             .  .                      .  .M
           ?             ?  ?                      ?  ?
           .             .  .                      .  .M
           ]             |  :                      :  |M_.recv()--->[ APP.recv()
           ]             |  :                      |  :             [ and
           .             .  .                      .  .             [ can 
           ?             ?  ?                      ?  ?             ?
           .             .  .                      .  .             [ 
           ]             |  :                      |  :             [    .send()
           ]             |  :                      |  :             [ after
           ]             |  :                      |  :             [    .recv()
           ]             |  :                      |  :             [ 
           ]             |  :                      |<-:--.send()<---[ APP.send()
           ]             |  :                     /:  |
           ]            <|__:____________________/ :  |
           ]            M|  :                      :  |
           .            M.  .                      .  .
           ?             ?  ?                      ?  ?
           .            M.  .                      .  .
[*]        ]            M|  :                      :  |
APP.recv() ]<---.recv()_M|  :                      :  |
                         :  |                      :  |

答案 1 :(得分:0)

你可以看看名为czmq的高级ZeroMQ api。它配备了ZeroMQ库。 它具有函数zstr_recv_nowait()详细信息:zstr man page

示例:

//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
     }
}