In following code. Publisher thread publish 5 messages then again new publisher socket is supposed to send data to subscriber but subscriber is in while(1) loop for recv() and never get message from 2nd publisher. How subscriber can connect to publisher 2 with some exception handling that subscriber 2 is trying to connect.
I tried with XPUB/XSUB, PUSH/PULL and also ZMQ_HEARTBEAT but no exception is caught. Also tried with "inproc://#1" instead of "tcp://127.0.0.1:5555". Nothing worked
#include <future>
#include <iostream>
#include <string>
#include "zmq.hpp"
#include <string>
#include <strings.h>
#include <stdint.h>
#include <chrono>
#include <thread>
void PublisherThread(zmq::context_t* ctx){
try{
std::cout << "PublisherThread: " << std::endl;
zmq::socket_t publisher(*ctx, ZMQ_PUB);
publisher.bind("tcp://127.0.0.1:5555");
int counter = 0;
while (true){
try{
publisher.send(zmq::str_buffer("A"), zmq::send_flags::sndmore);
publisher.send(zmq::str_buffer("Message in A envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
publisher.send(zmq::str_buffer("B"), zmq::send_flags::sndmore);
publisher.send(zmq::str_buffer("Message in B envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
publisher.send(zmq::str_buffer("C"), zmq::send_flags::sndmore);
publisher.send(zmq::str_buffer("Message in C envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
if(counter == 5){
publisher.close();
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
counter = 0;
break;
}
else{
counter++;
}
}
catch(const zmq::error_t& ze){
std::cout<<"PublisherThread: catch 2:"<<ze.what()<<std::endl;
}
}
}
catch(const zmq::error_t& ze){
std::cout<<"PublisherThread: catch 1:"<<ze.what()<<std::endl;
}
try{
zmq::socket_t publisher2(*ctx, ZMQ_PUB);
publisher2.bind("tcp://127.0.0.1:5555");
int counter = 0;
while (true){
try{
// Write three messages, each with an envelope and content
publisher2.send(zmq::str_buffer("A"), zmq::send_flags::sndmore);
publisher2.send(zmq::str_buffer("Message in A envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
publisher2.send(zmq::str_buffer("B"), zmq::send_flags::sndmore);
publisher2.send(zmq::str_buffer("Message in B envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
publisher2.send(zmq::str_buffer("C"), zmq::send_flags::sndmore);
publisher2.send(zmq::str_buffer("Message in C envelope\n"));
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
if(counter == 50){
publisher2.close();
break;
}
else{
counter++;
}
}
catch(const zmq::error_t& ze){
std::cout<<"PublisherThread: catch 4:"<<ze.what()<<std::endl;
}
}
}
catch(const zmq::error_t& ze){
std::cout<<"PublisherThread: catch 3:"<<ze.what()<<std::endl;
}
std::cout<<"PublisherThread: exiting:"<<std::endl;
void SubscriberThread1(zmq::context_t* ctx){
std::cout<< "SubscriberThread1: " << std::endl;
zmq::socket_t subscriber(*ctx, ZMQ_SUB);
subscriber.setsockopt(ZMQ_SUBSCRIBE, "A", 1);
subscriber.setsockopt(ZMQ_SUBSCRIBE, "B", 1);
subscriber.connect("tcp://127.0.0.1:5555");
while (1){
try{
zmq::message_t address;
zmq::recv_result_t result = subscriber.recv(address);
// Read message contents
zmq::message_t contents;
result = subscriber.recv(contents);
std::cout<< "Thread2: "<< std::string(static_cast<char*>(contents.data()), contents.size())<< std::endl;
}
catch(const zmq::error_t& ze){
std::cout<<"subscriber catch error:"<<ze.what()<<std::endl;
}
}
}
int main(){
zmq::context_t* zmq_ctx = new zmq::context_t();
std::thread thread1(PublisherThread, zmq_ctx);
std::thread thread2(SubscriberThread1, zmq_ctx);
thread1.join();
thread2.join();
}