c++ - ZeroMQ:带有大消息的 REQ/REP

标签 c++ sockets zeromq

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

  1. 元数据(~ 1 KB)
  2. 数据(~ 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/

相关文章:

c++ - 如何从开始和结束迭代器创建范围?

multithreading - 阻止 SSL_read() 会在合作伙伴使用线程关闭连接时导致崩溃

c# - TCP/IP客户端服务器在c#中通过不同网络进行通信

FFmpeg 使用 sendcmd/zmq 绘制文本和实时坐标

python - ZMQ 删除旧消息

c++ - C++构造函数中的双花括号

c++ - 为什么我在编译时总是出错:包括嵌套太深的C++

c# - 通过在 C# 中导入 DLL 来重用 C++ 函数

java - 连接到 xmpp 出现套接字异常(权限被拒绝)

c++ - 提升 : Serializing/De-serializing a custom C++ object passed over ZeroMQ pull socket