@@ -11,14 +11,22 @@ Messenger::Messenger() {
1111 try {
1212 publisher_.bind (" tcp://*:0" );
1313 endpoint_ = publisher_.get (zmq::sockopt::last_endpoint);
14- LOG (INFO) << " ZMQ PUB : " << endpoint_;
14+ LOG (INFO) << " Publisher : " << endpoint_;
1515 } catch (const zmq::error_t &e) {
1616 LOG (ERROR) << " Failed to bind ZMQ publisher: " << e.what ();
1717 context_.close ();
1818 publisher_.close ();
1919 }
20+ asker_ = zmq::socket_t (context_, zmq::socket_type::rep);
21+ asker_.bind (" tcp://*:4565" );
22+ ask_thread_ = std::thread ([this ] { WaitAsk (); });
23+ }
24+ Messenger::~Messenger () {
25+ publisher_.close ();
26+ while (ask_thread_.joinable ()) {
27+ ask_thread_.join ();
28+ }
2029}
21- Messenger::~Messenger () { publisher_.close (); }
2230void Messenger::Pub (const std::string &topic, const std::string &metadata) {
2331 try {
2432 zmq::message_t topic_msg (topic.size ());
@@ -47,4 +55,18 @@ void Messenger::PubStruct(const std::string &topic, const void *data, const size
4755}
4856std::string Messenger::GetPubEndpoint () const { return endpoint_; }
4957
58+ [[noreturn]] void Messenger::WaitAsk () {
59+ while (true ) {
60+ zmq::message_t request;
61+ asker_.recv (request, zmq::recv_flags::none);
62+ std::string received_msg (static_cast <char *>(request.data ()), request.size ());
63+ if (received_msg == " ask_endpoint" ) {
64+ std::string reply_msg = GetPubEndpoint ();
65+ zmq::message_t reply (reply_msg.size ());
66+ memcpy (reply.data (), reply_msg.data (), reply_msg.size ());
67+ asker_.send (reply, zmq::send_flags::none);
68+ }
69+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
70+ }
71+ }
5072} // namespace infinite_sense
0 commit comments