==== EDIT ====
For the pub/sub pattern, the following code works with both small and large messages.
Publisher:
#include <iostream>
#include <thread>
#include <zmq.hpp>
int main(int argc, const char *argv[]) {
zmq::context_t context(1);
zmq::socket_t publisher(context, zmq::socket_type::pub);
publisher.bind("tcp://*:5556");
for (auto i = 0; i < 10; ++i) {
std::string data = "sequence" + std::string(32 * 1024 * 1024, ' ');
zmq::message_t msg(data);
std::cout << "pub: " << msg.str() << std::endl;
auto rc = publisher.send(msg, zmq::send_flags::dontwait);
assert(rc);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
Subscriber:
#include <iostream>
#include <zmq.hpp>
int main(int argc, const char *argv[]) {
zmq::context_t context(1);
zmq::socket_t subscriber(context, zmq::socket_type::sub);
subscriber.connect("tcp://localhost:5556");
subscriber.set(zmq::sockopt::subscribe, "sequence");
for (auto i = 0; i < 5; ++i) {
zmq::message_t msg;
auto rc = subscriber.recv(msg, zmq::recv_flags::none);
assert(rc);
std::cout << "sub: " << msg << std::endl;
};
return 0;
}
Expected Output:
pub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
sub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
sub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
sub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
sub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
sub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
pub: zmq::message_t [size 33554440] (... too big to print)
==== End Edit ====
For the request/reply pattern, the following code works with both small and large messages.
Server:
#include <iostream>
#include <zmq.hpp>
int main(int argc, const char *argv[]) {
zmq::context_t context(1);
zmq::socket_t server(context, zmq::socket_type::rep);
server.bind("tcp://*:5556");
while (1) {
zmq::message_t request;
auto rc = server.recv(request);
assert(rc);
std::cout << "server recv: " << request.str() << std::endl;
auto n = atoi(request.to_string().c_str());
std::string data(n, 'x');
zmq::message_t reply(data);
std::cout << "server send: " << reply.str() << std::endl;
server.send(reply, zmq::send_flags::dontwait);
if (n == 0)
break;
}
return 0;
}
Client:
#include <iostream>
#include <zmq.hpp>
int main(int argc, const char *argv[]) {
zmq::context_t context(1);
zmq::socket_t client(context, zmq::socket_type::req);
client.connect ("tcp://localhost:5556");
auto l = [&](std::string size) {
zmq::message_t request(size);
std::cout << "cleint send: " << request << std::endl;
client.send(request, zmq::send_flags::none);
zmq::message_t reply;
auto rc = client.recv(reply, zmq::recv_flags::none);
assert(rc);
std::cout << "client recv: " << reply << std::endl;
};
l("1024");
l("32000000");
l("0");
return 0;
}
Output:
client send: zmq::message_t [size 004] ( 1024)
server recv: zmq::message_t [size 004] ( 1024)
server send: zmq::message_t [size 1024] (... too big to print)
client recv: zmq::message_t [size 1024] (... too big to print)
client send: zmq::message_t [size 008] ( 32000000)
server recv: zmq::message_t [size 008] ( 32000000)
server send: zmq::message_t [size 32000000] (... too big to print)
client recv: zmq::message_t [size 32000000] (... too big to print)
client send: zmq::message_t [size 001] ( 0)
server recv: zmq::message_t [size 001] ( 0)
server send: zmq::message_t [size 000] ()
client recv: zmq::message_t [size 000] ()