如何分离消息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();
}
Q : "How to separate message zmq server?"
好吧,避免尝试立即移动 6.7 GB
。使用 sndmore
技巧将大量数据作为 multi-part 结构化消息发送并不能解决问题,因为这样的结构化消息(几乎)永远不适合 RAM-constraints.
最好设置索引 data-reader,将巨大的 data-file 移动到合理大小的 solo-blocks 中(避免使用 multi-part 类型的消息)并让接收者保持跟踪到目前为止 index-numbers 已收到的内容(向发件人确认 POSACK 的接收 + re-requesting 缺少 index-blocks 以获取 ev. resent)。
ZeroMQ 不提供传递任何消息的保证,但它可以让您确定,如果您有 .recv()
-ed 有效载荷,它是 binary-identical 副本 .send()
-调度数据。因此,在前面加上一个 index-number 并按照描述发送有效载荷,你有一个相当健壮的 BLOB-parse/send/re-assemble 和一些可能的 re-send 请求。
我正在尝试通过 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();
}
Q : "How to separate message zmq server?"
好吧,避免尝试立即移动 6.7 GB
。使用 sndmore
技巧将大量数据作为 multi-part 结构化消息发送并不能解决问题,因为这样的结构化消息(几乎)永远不适合 RAM-constraints.
最好设置索引 data-reader,将巨大的 data-file 移动到合理大小的 solo-blocks 中(避免使用 multi-part 类型的消息)并让接收者保持跟踪到目前为止 index-numbers 已收到的内容(向发件人确认 POSACK 的接收 + re-requesting 缺少 index-blocks 以获取 ev. resent)。
ZeroMQ 不提供传递任何消息的保证,但它可以让您确定,如果您有 .recv()
-ed 有效载荷,它是 binary-identical 副本 .send()
-调度数据。因此,在前面加上一个 index-number 并按照描述发送有效载荷,你有一个相当健壮的 BLOB-parse/send/re-assemble 和一些可能的 re-send 请求。