ZeroMQ:REQ / REP包含大量消息

时间:2015-12-14 18:48:43

标签: c++ sockets zeromq

我正在尝试通过 300 MB -socket发送大邮件(REP)。 有多个客户端,每个客户端通过 REQ -socket连接到服务器。服务器为每个客户端创建一个专用套接字,等待请求(包含标识符)并使用 ZMQ_SENDMORE 分两部分发送消息:

  1. 元数据(〜1 KB
  2. 数据(〜300 MB
  3. 之后,REP - 套接字立即关闭。然后在父线程中关闭Context() - 实例。套接字的 ZMQ_LINGER 时间保留为默认值(无限)。 有时会发送元数据,但不会发送图像数据。
    我在ZeroMQ中跟踪调用,发现内部(windows)套接字在消息数据发送到网络之前已关闭。我认为只要队列中有未发送的消息, zmq_term() 就会阻止。
    作为一种解决方法,我将客户端更改为在收到数据作为确认后发送另一个请求消息。这很有效,但我不太确定我是否解决了根本问题。

    ZeroMQ版本是4.0.4。我正在使用C ++绑定。服务器和客户端都在Windows上运行(7和10)。

1 个答案:

答案 0 :(得分:1)

我知道这不是你想要的答案,但我在Linux上遇到过与ZeroMQ类似的东西。底层Linux套接字关闭,一些消息从未通过。

在我的用例中,我保持服务器处于打开状态,直到用户给我一些键盘输入。这是一个黑客,但对于我的用例,它给了我想要的东西。

在关闭套接字之前,您也可以睡一两秒钟。再一次,不漂亮,但它可能是一个快速修复,直到它得到修补。

编辑添加:我也发送多部分消息,我的一个消息部分相当大(约200MB)。