【问题标题】:How to separate message zmq server?如何分离消息zmq服务器?
【发布时间】:2020-11-04 21:14:01
【问题描述】:

我正在尝试通过 ZeroMQ 服务器发送视频,并通过 1 GB 视频成功获取了它,但是当我尝试发送具有非常大尺寸的电影时(@ 987654322@ ) 我收到以下错误:

cliente: /usr/local/include/zmq.hpp:1958: zmq::recv_result_t zmq::detail::socket_base::recv(zmq::message_t&, zmq::recv_flags): Assertion `msg.size() == static_cast<size_t>(nbytes)' failed.
make: *** [Makefile:7: cliente] Aborted
make: *** Deleting file 'cliente'

所以我试图破坏服务器上的文件并将其单独发送到客户端,但我得到了同样的错误。有人知道如何将message_t 分开发送给客户端吗?
这是服务器代码:

#include <fstream>
#include <sstream>
#include <chrono>
#include <thread>
#include <iostream>
#include <zmq.hpp>

using namespace std::chrono_literals;

int main()
{
  zmq::context_t context(1);
  zmq::socket_t socket(context, zmq::socket_type::rep);
  socket.bind("tcp://*:5555");
  std::ifstream img("video.mkv", std::ifstream::in | std::ios::binary);
  for (;;)
  {
    zmq::message_t message;
    socket.recv(message, zmq::recv_flags::none);
    std::ostringstream os;
    os << img.rdbuf();
    std::string oss(os.str());
    socket.send(zmq::buffer(oss.substr(0, (oss.size() / 2))), zmq::send_flags::sndmore);
    std::this_thread::sleep_for(1s);
    socket.send(zmq::buffer(oss.substr((oss.size() / 2), oss.size() - 1)), zmq::send_flags::none);
    std::this_thread::sleep_for(1s);
  }
}

这是我的客户:

#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <zmq.hpp>

int main()
{
  std::ofstream img("teste.mkv", std::ios::out | std::ios::binary);
  zmq::context_t context(2);
  zmq::socket_t socket(context, zmq::socket_type::req);
  socket.connect("tcp://localhost:5555");
  zmq::message_t message_1, message_2;
  socket.send(zmq::buffer("ok\n"), zmq::send_flags::none);
  socket.recv(message_1, zmq::recv_flags::none);
  std::string data_1(message_1.to_string());
  img << data_1;
  data_1.clear();
  socket.recv(message_2, zmq::recv_flags::none);
  std::string data_2(message_2.to_string());
  img << data_2;
  data_2.clear();
}

【问题讨论】:

    标签: c++ c++11 c++14 zeromq


    【解决方案1】:

    Q“如何分离消息zmq服务器?”

    好吧,避免尝试立即移动 6.7 GB。使用 sndmore 技巧将大量数据作为多部分结构化消息发送并不能解决问题,因为这样的结构化消息(几乎)永远不会适合 RAM 约束。

    最好设置一个索引数据阅读器,将巨大的数据文件移动到合理大小的单独块中(避免使用多部分类型的消息)并让接收者跟踪到目前为止已收到的索引号(向发送者确认 POSACK 的接收 + 重新请求丢失的索引块以获取 ev。重新发送)。

    ZeroMQ 不提供传递任何消息的保证,但它可以确保,如果您有 .recv()-ed 有效负载,它是 .send()-dispatched 数据的二进制相同副本。因此,按照描述添加一个索引号并发送有效负载,您将拥有一个相当健壮的 BLOB 解析/发送/重新组装,并带有一些可能的重新发送请求。

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 1970-01-01
      • 2019-09-19
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      相关资源
      最近更新 更多