Я могу найти только старые исходные примеры на С++. В любом случае, я сделал свое, основанное на них. Здесь мой издатель в python:
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5563")
while True:
    msg = "hello"
    socket.send_string(msg)
    print("sent "+ msg)
    sleep(5)
А вот абонент в С++:
void * ctx = zmq_ctx_new();
void * subscriber = zmq_socket(ctx, ZMQ_SUB);
// zmq_connect(subscriber, "tcp://*:5563");
   zmq_connect(subscriber, "tcp://localhost:5563");
// zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", sizeof(""));
while (true) {
    zmq_msg_t msg;
    int rc;
    rc = zmq_msg_init( & msg);
    assert(rc == 0);
    std::cout << "waiting for message..." << std::endl;
    rc = zmq_msg_recv( & msg, subscriber, 0);
    assert(rc == 1);
    std::cout << "received: " << (char * ) zmq_msg_data( & msg) << std::endl;
    zmq_msg_close( & msg);
}
Изначально я пробовал zmq_setsockopt( subscriber, ZMQ_SUBSCRIBE, "", sizeof("") );, но я предполагаю, что должен получить все, если я не установлю это, не так ли? Поэтому я прокомментировал это.
Когда я запускаю код, я вижу "ожидание сообщения..." навсегда.
Я попытался прослушать TCP-трафик с помощью  tcpdump. Оказывается, что когда издатель включен, я вижу много мусора в порту 5563, и когда я выключу издателя, они останавливаются. Когда я попробовал схему PUSH/PULL, я мог видеть сообщение открытого текста в tcpdump. (Я попытался нажать с nodejs и потянул с помощью С++, и он сработал).
Что я могу делать неправильно?
Я пробовал разные комбинации .bind(), .connect(), localhost, 127.0.0.1, но они тоже не будут работать.
  UPDATE: я только что прочитал, что должен подписаться на что-то, поэтому я сделал zmq_setsockopt( subscriber, ZMQ_SUBSCRIBE, NULL, 0 );, чтобы подписаться на все, но я все еще ничего не получил
PyZMQ находится в версии 17.0.0.b3 и имеет ZeroMQ 4.2.3
С++ имеет ZeroMQ 4.2.2
ОБНОВЛЕНИЕ 2:
Обновляется как до 4.2.3, так и не работает.