#include <zmq.h>
#include <json/json.h>
-
+/**
+ * ZMQ based request-response server
+ *
+ */
TrexRpcServerReqRes::TrexRpcServerReqRes(const TrexRpcServerConfig &cfg) : TrexRpcServerInterface(cfg) {
/* ZMQ is not thread safe - this should be outside */
m_context = zmq_ctx_new();
}
+/**
+ * main entry point for the server
+ * this function will be created on a different thread
+ *
+ * @author imarom (17-Aug-15)
+ */
void TrexRpcServerReqRes::_rpc_thread_cb() {
std::stringstream ss;
- // Socket to talk to clients
+ /* create a socket based on the configuration */
+
m_socket = zmq_socket (m_context, ZMQ_REP);
switch (m_cfg.get_protocol()) {
ss << m_cfg.get_port();
+ /* bind the scoket */
int rc = zmq_bind (m_socket, ss.str().c_str());
if (rc != 0) {
throw TrexRpcException("Unable to start ZMQ server at: " + ss.str());
while (m_is_running) {
int msg_size = zmq_recv (m_socket, m_msg_buffer, sizeof(m_msg_buffer), 0);
+ /* msg_size of -1 is an error - decode it */
if (msg_size == -1) {
/* normal shutdown and zmq_term was called */
if (errno == ETERM) {
}
}
+ /* transform it to a string */
std::string request((const char *)m_msg_buffer, msg_size);
handle_request(request);
}
zmq_close(m_socket);
}
+/**
+ * stops the ZMQ based RPC server
+ *
+ */
void TrexRpcServerReqRes::_stop_rpc_thread() {
/* by calling zmq_term we signal the blocked thread to exit */
zmq_term(m_context);
}
+/**
+ * handles a request given to the server
+ * respondes to the request
+ */
void TrexRpcServerReqRes::handle_request(const std::string &request) {
std::vector<TrexJsonRpcV2ParsedObject *> commands;
Json::FastWriter writer;
Json::Value response;
+ /* first parse the request using JSON RPC V2 parser */
TrexJsonRpcV2Parser rpc_request(request);
-
rpc_request.parse(commands);
int index = 0;
+ /* for every command parsed - launch it */
for (auto command : commands) {
Json::Value single_response;