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