Repo-Init
 
Loading...
Searching...
No Matches
ZeroMQServer.hpp File Reference
#include "zeromq/ZeroMQ.hpp"
#include "zeromq/ZeroMQMonitor.hpp"
#include "zeromq/ZeroMQStats.hpp"
#include <functional>
Include dependency graph for ZeroMQServer.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  ZeroMQServer
 

Typedefs

using FPTR_MessageCallback = std::function<bool(const std::vector<zmq::message_t> &, std::vector<zmq::message_t> &)>
 

Functions

bool ZeroMQServerMessageCallback (const std::vector< zmq::message_t > &recvMsgs, std::vector< zmq::message_t > &replyMsgs)
 

Typedef Documentation

◆ FPTR_MessageCallback

using FPTR_MessageCallback = std::function<bool(const std::vector<zmq::message_t> &, std::vector<zmq::message_t> &)>

Definition at line 9 of file ZeroMQServer.hpp.

Function Documentation

◆ ZeroMQServerMessageCallback()

bool ZeroMQServerMessageCallback ( const std::vector< zmq::message_t > & recvMsgs,
std::vector< zmq::message_t > & replyMsgs )

ZeroMQ message received callback

Parameters
[in]recvMsgsReceived messages
[out]replyMsgsReply messages returned by callback
Returns
true If the callback successfully processes the received messages
false otherwise

Definition at line 115 of file ZeroMQServer.cpp.

116{
117 spdlog::trace("Received {} messages", recvMsgs.size());
118 replyMsgs.clear();
119
120 std::string replyBody;
121 int reply = ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL;
122 switch (*(static_cast<const uint32_t *>(recvMsgs[0].data())))
123 {
124 case LOG_LEVEL_ID: {
125 if (recvMsgs.size() != 2)
126 {
127 spdlog::error("Received unknown number of messages for log level change");
128 break;
129 }
130
131 spdlog::warn("Log level change request received");
132 const auto receivedMsg = std::string(static_cast<const char *>(recvMsgs[1].data()), recvMsgs[1].size());
133
134 if (receivedMsg == "v")
135 {
136 spdlog::set_level(spdlog::level::info);
137 }
138 if (receivedMsg == "vv")
139 {
140 spdlog::set_level(spdlog::level::debug);
141 }
142 if (receivedMsg == "vvv")
143 {
144 spdlog::set_level(spdlog::level::trace);
145 }
146 if (receivedMsg == "r")
147 {
148#ifdef NDEBUG
149 spdlog::set_level(spdlog::level::warn);
150#else
151 spdlog::set_level(spdlog::level::info);
152#endif
153 }
154 reply = ZMQ_EVENT_HANDSHAKE_SUCCEEDED;
155 break;
156 }
157 case VERSION_INFO_ID: {
158 if (recvMsgs.size() != 1)
159 {
160 spdlog::error("Received unknown number of messages for version information");
161 break;
162 }
163
164 reply = ZMQ_EVENT_HANDSHAKE_SUCCEEDED;
165 replyBody = PROJECT_FULL_VERSION_STRING;
166 break;
167 }
168 case PING_PONG_ID: {
169 if (recvMsgs.size() != 1)
170 {
171 spdlog::error("Received unknown number of messages for ping");
172 break;
173 }
174
175 reply = ZMQ_EVENT_HANDSHAKE_SUCCEEDED;
176 replyBody = "PONG";
177 break;
178 }
179 case STATUS_CHECK_ID: {
180 if (recvMsgs.size() != 1)
181 {
182 spdlog::error("Received unknown number of messages for status check");
183 break;
184 }
185
186 reply = ZMQ_EVENT_HANDSHAKE_SUCCEEDED;
187
188 std::ostringstream oss;
189 oss << "{";
190 for (const auto &[process, statusFlag] : vCheckFlag)
191 {
192 oss << "\"" << process << "\":" << (statusFlag->test() ? "1," : "0,");
193 }
194 replyBody = oss.str();
195 replyBody.replace(replyBody.size() - 1, 1, "}");
196 break;
197 }
198 /* ################################################################################### */
199 /* ############################# MAKE MODIFICATIONS HERE ############################# */
200 /* ################################################################################### */
201
202 /* ################################################################################### */
203 /* ################################ END MODIFICATIONS ################################ */
204 /* ################################################################################### */
205 default:
206 spdlog::error("Unknown command received from control");
207 break;
208 }
209
210 // Prepare reply
211 replyMsgs.emplace_back(&reply, sizeof(reply));
212 replyMsgs.emplace_back(replyBody.c_str(), replyBody.size());
213
214 return reply == ZMQ_EVENT_HANDSHAKE_SUCCEEDED;
215}
std::vector< std::pair< std::string, std::shared_ptr< std::atomic_flag > > > vCheckFlag
Global variable to check if the servers are running.
constexpr uint32_t PING_PONG_ID
constexpr uint32_t VERSION_INFO_ID
constexpr uint32_t LOG_LEVEL_ID
constexpr uint32_t STATUS_CHECK_ID
Here is the caller graph for this function: