我正在尝试通过 REP
-socket 发送大消息 (300 MB
)。
有多个客户端,每个客户端都通过 REQ
-socket 连接到服务器。服务器为每个客户端创建一个专用套接字,等待请求(包含标识符)并使用 ZMQ_SENDMORE
将消息分两部分发送:
- 元数据(~
1 KB
) - 数据(~
300 MB
)
之后 REP
-socket 立即关闭。 Context()
实例随后在父线程中关闭。 ZMQ_LINGER
套接字的时间默认保留(无限)。
有时会发送元数据,但不会发送图像数据。
我跟踪了 ZeroMQ 中的调用,发现在将消息数据发送到网络之前,内部 (windows) 套接字已关闭。我认为只要队列中有未发送的消息,zmq_term()
就会阻塞。
作为解决方法,我将客户端更改为在收到数据作为确认后发送另一条请求消息。这工作得很好,但我不太确定我是否已经解决了根本问题。
ZeroMQ 版本为 4.0.4。我正在使用 C++ 绑定(bind)。服务器和客户端都在 Windows(7 和 10)上运行。
最佳答案
我知道这不是您想要的答案,但我在 Linux 上使用 ZeroMQ 时遇到过类似的情况。底层 Linux 套接字关闭,一些消息从未通过。
在我的用例中,我让服务器保持打开状态,直到用户给我一些键盘输入。这是一个 hack,但对于我的用例,它提供了我想要的东西。
您也可以在关闭套接字之前休眠一两秒钟。再一次,这不是很好,但在修补之前它可能是一个快速修复。
编辑添加:我也在发送多部分消息,我的消息部分之一相当大(~200MB)。
关于c++ - ZeroMQ:带有大消息的 REQ/REP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274418/