簡體   English   中英

如何分離消息zmq服務器?

[英]How to separate message zmq server?

我正在嘗試通過 ZeroMQ 服務器發送視頻,並成功獲得了1 GB視頻,但是當我嘗試發送具有非常大尺寸( 6.7 GB )的電影時,出現以下錯誤:

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();
}

“如何分離消息zmq服務器?”

好吧,避免嘗試一次移動6.7 GB 使用sndmore技巧將大量數據作為多部分結構化消息發送並不能解決問題,因為這樣的結構化消息(幾乎)永遠不會適合 RAM 約束。

最好設置一個索引數據讀取器,在合理大小的單獨塊中移動巨大的數據文件(避免使用多部分類型的消息)並使接收器跟蹤到目前為止收到的索引號(確認 POSACK 'd 接收到發送者 + 重新請求丟失的索引塊以獲得 ev. resent )。

ZeroMQ 不提供傳遞任何消息的保證,但它可以讓您確定,如果您有.recv() -ed 有效載荷,它是.send() -dispatched 數據的二進制相同副本。 因此,預先添加一個索引號並按照描述發送有效負載,並且您有一個相當健壯的 BLOB 解析/發送/重新組裝,並帶有一些可能的重新發送請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM