#include "proto/service.pb.h" #include "mesy_nng.h" using namespace mesytec; void requester(nng_socket socket, unsigned id) { std::uint32_t seq = 0; while (true) { mnode::Ping ping; ping.set_peer_id(id); ping.set_sequence_number(seq++); auto reqMsg = nng::make_message(ping.SerializeAsString()); if (int rc = nng_sendmsg(socket, reqMsg.release(), 0)) { nng::mesy_nng_error("nng_sendmsg", rc); if (rc != NNG_ETIMEDOUT) return; continue; } spdlog::info("Sent ping request: {}", ping.ShortDebugString()); auto [repMsg, rc] = nng::receive_message(socket); if (rc) { nng::mesy_nng_error("nng_recvmsg", rc); if (rc != NNG_ETIMEDOUT) return; continue; } mnode::Pong pong; pong.ParseFromArray(nng_msg_body(repMsg.get()), nng_msg_len(repMsg.get())); spdlog::info("Received pong response: {}", pong.ShortDebugString()); } } void responder(nng_socket socket, unsigned id) { while (true) { auto [reqMsg, rc] = nng::receive_message(socket); if (rc) { nng::mesy_nng_error("nng_recvmsg", rc); if (rc != NNG_ETIMEDOUT) return; continue; } mnode::Ping ping; ping.ParseFromArray(nng_msg_body(reqMsg.get()), nng_msg_len(reqMsg.get())); spdlog::info("Received ping request: {}", ping.ShortDebugString()); mnode::Pong pong; pong.set_peer_id(id); pong.set_sequence_number(ping.sequence_number()); auto repMsg = nng::make_message(pong.SerializeAsString()); if (int rc = nng_sendmsg(socket, repMsg.release(), 0)) { nng::mesy_nng_error("nng_sendmsg", rc); if (rc != NNG_ETIMEDOUT) return; continue; } spdlog::info("Sent pong response: {}", pong.ShortDebugString()); } } int main() { spdlog::set_level(spdlog::level::info); auto reqSocket = nng::make_req_socket(); auto repSocket = nng::make_rep_socket(); if (int rc = nng::marry_listen_dial(reqSocket, repSocket, "inproc://test")) return rc; std::vector threads; threads.emplace_back(std::thread(requester, reqSocket, 0)); threads.emplace_back(std::thread(responder, repSocket, 1)); for (auto &t: threads) if (t.joinable()) t.join(); return 0; }