Problem
一旦数据序列化后, 送给zeromq的就是编码后的数据, 这时就无法使用envelop来过滤数据。
Solution
// Prepare publisher
zmq::socket_t publisher(*ctx, zmq::socket_type::pub);
publisher.bind("inproc://#1");
// Give the subscribers a chance to connect, so they don't lose any messages
std::this_thread::sleep_for(std::chrono::milliseconds(20));
// Write three messages, each with an envelope and content
publisher.send(zmq::str_buffer("A"), zmq::send_flags::sndmore);
publisher.send(zmq::str_buffer("Message in A envelope"));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
先使用zmq::send_flags::sndmore
发送envelop, 再发送序列化后的数据
subscriber
使用zmq::send_flags::sndmore
后, 接受侧会有一些变化, 每次会收到两个zmq::message_t
, 如下所示要使用一个vector来接受消息, 第一个消息是envelope, 第二个消息是content。
// Prepare subscriber
zmq::socket_t subscriber(*ctx, zmq::socket_type::sub);
subscriber.connect("inproc://#1");
// Thread2 opens "A" and "B" envelopes
subscriber.set(zmq::sockopt::subscribe, "A");
// Receive all parts of the message
std::vector<zmq::message_t> recv_msgs;
zmq::recv_result_t result =
zmq::recv_multipart(subscriber, std::back_inserter(recv_msgs));
assert(result && "recv failed");
assert(*result == 2);
std::cout << "Thread2: [" << recv_msgs[0].to_string() << "] "
<< recv_msgs[1].to_string() << std::endl;
Reference
https://github.com/zeromq/cppzmq/blob/master/examples/pubsub_multithread_inproc.cpp
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。