diff options
-rw-r--r-- | src/rpc-server/include/trex_rpc_server_api.h | 1 | ||||
-rw-r--r-- | src/rpc-server/src/trex_rpc_req_resp.cpp | 28 | ||||
-rw-r--r-- | src/rpc-server/src/trex_rpc_server.cpp | 5 |
3 files changed, 31 insertions, 3 deletions
diff --git a/src/rpc-server/include/trex_rpc_server_api.h b/src/rpc-server/include/trex_rpc_server_api.h index 8009137f..5f567a5c 100644 --- a/src/rpc-server/include/trex_rpc_server_api.h +++ b/src/rpc-server/include/trex_rpc_server_api.h @@ -105,6 +105,7 @@ protected: /** * TREX RPC server * may contain serveral types of RPC servers + * (request response, async and etc.) * * @author imarom (12-Aug-15) */ diff --git a/src/rpc-server/src/trex_rpc_req_resp.cpp b/src/rpc-server/src/trex_rpc_req_resp.cpp index 2d8f12fa..f5fad461 100644 --- a/src/rpc-server/src/trex_rpc_req_resp.cpp +++ b/src/rpc-server/src/trex_rpc_req_resp.cpp @@ -30,16 +30,26 @@ limitations under the License. #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()) { @@ -52,6 +62,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() { 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()); @@ -61,6 +72,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() { 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) { @@ -70,6 +82,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() { } } + /* transform it to a string */ std::string request((const char *)m_msg_buffer, msg_size); handle_request(request); } @@ -78,23 +91,32 @@ void TrexRpcServerReqRes::_rpc_thread_cb() { 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; diff --git a/src/rpc-server/src/trex_rpc_server.cpp b/src/rpc-server/src/trex_rpc_server.cpp index 2e3f97f9..bdbab5cf 100644 --- a/src/rpc-server/src/trex_rpc_server.cpp +++ b/src/rpc-server/src/trex_rpc_server.cpp @@ -38,6 +38,11 @@ TrexRpcServerInterface::~TrexRpcServerInterface() { } } +/** + * starts a RPC specific server + * + * @author imarom (17-Aug-15) + */ void TrexRpcServerInterface::start() { m_is_running = true; |