From c46396a18a1fa40e1fbe6b2c55c2da98401dc2f2 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Wed, 16 Aug 2023 16:01:53 +0800 Subject: [PATCH] Use hash in switch method instead of map list --- src/pc/peer_connection.cpp | 12 +- src/pc/peer_connection.h | 2 +- tests/signal_server/sdp_manager.cpp | 6 + tests/signal_server/sdp_manager.h | 28 +++++ tests/signal_server/signal_server.cpp | 140 +++++++++++----------- tests/signal_server/signal_server.h | 10 +- tests/signal_server/ws_handle_manager.cpp | 5 + tests/signal_server/ws_handle_manager.h | 24 ++++ 8 files changed, 151 insertions(+), 76 deletions(-) create mode 100644 tests/signal_server/sdp_manager.cpp create mode 100644 tests/signal_server/sdp_manager.h create mode 100644 tests/signal_server/ws_handle_manager.cpp create mode 100644 tests/signal_server/ws_handle_manager.h diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 5128529..8b8efd5 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -9,7 +9,7 @@ using nlohmann::json; static const std::map siganl_types{ - {"connection_id", 1}, + {"ws_connection_id", 1}, {"offer", 2}, {"transport_id", 3}, {"remote_sdp", 4}, @@ -43,8 +43,9 @@ int PeerConnection::Init(PeerConnectionParams params) { LOG_INFO("msg type :{}", itr->first); switch (itr->second) { case 1: { - connection_id_ = j["connection_id"].get(); - LOG_INFO("Receive local peer connection_id [{}]", connection_id_); + ws_connection_id_ = j["ws_connection_id"].get(); + LOG_INFO("Receive local peer websocket connection id [{}]", + ws_connection_id_); signal_status_ = SignalStatus::Connected; break; } @@ -100,8 +101,9 @@ int PeerConnection::Init(PeerConnectionParams params, std::string const &id) { LOG_INFO("msg type :{}", itr->first); switch (itr->second) { case 1: { - connection_id_ = j["connection_id"].get(); - LOG_INFO("Receive local peer connection_id [{}]", connection_id_); + ws_connection_id_ = j["ws_connection_id"].get(); + LOG_INFO("Receive local peer websocket connection id [{}]", + ws_connection_id_); signal_status_ = SignalStatus::Connected; break; } diff --git a/src/pc/peer_connection.h b/src/pc/peer_connection.h index 9a7465f..818e17a 100644 --- a/src/pc/peer_connection.h +++ b/src/pc/peer_connection.h @@ -39,7 +39,7 @@ class PeerConnection { IceTransport *ice_transport_ = nullptr; std::function on_receive_ws_msg_ = nullptr; std::function on_receive_ice_msg_ = nullptr; - unsigned int connection_id_ = 0; + unsigned int ws_connection_id_ = 0; std::string transport_id_ = ""; SignalStatus signal_status_ = SignalStatus::Closed; }; diff --git a/tests/signal_server/sdp_manager.cpp b/tests/signal_server/sdp_manager.cpp new file mode 100644 index 0000000..d2a9bec --- /dev/null +++ b/tests/signal_server/sdp_manager.cpp @@ -0,0 +1,6 @@ + +#include "sdp_manager.h" + +SdpManager ::SdpManager() {} + +SdpManager ::~SdpManager() {} \ No newline at end of file diff --git a/tests/signal_server/sdp_manager.h b/tests/signal_server/sdp_manager.h new file mode 100644 index 0000000..a9ac8e2 --- /dev/null +++ b/tests/signal_server/sdp_manager.h @@ -0,0 +1,28 @@ +#ifndef _SDP_MANAGER_H_ +#define _SDP_MANAGER_H_ + +#include +#include + +class SdpManager { + public: + SdpManager(); + ~SdpManager(); + + public: + int AddOfferSdpToConnection(std::string &sdp, std::string &connection_id); + int AddAnswerSdpToConnection(std::string &sdp, std::string &connection_id); + int UpdateOfferSdpToConnection(std::string &sdp, std::string &connection_id); + int UpdateAnswerSdpToConnection(std::string &sdp, std::string &connection_id); + + const std::string &GetOfferSdpFromConnection(std::string &connection_id); + const std::string &GetAnswerSdpFromConnection(std::string &connection_id); + + int RemoveConnetion(std::string &connection_id); + + private: + // . + std::map> answer_hdl_map_; +}; + +#endif \ No newline at end of file diff --git a/tests/signal_server/signal_server.cpp b/tests/signal_server/signal_server.cpp index 91e4df3..a1475b1 100644 --- a/tests/signal_server/signal_server.cpp +++ b/tests/signal_server/signal_server.cpp @@ -2,9 +2,17 @@ #include "log.h" -static const std::map siganl_types{ - {"create_transport", 1}, {"offer", 2}, {"query_remote_sdp", 3}, - {"answer", 4}, {"offer_candidate", 5}, {"answer_candidate", 6}}; +constexpr size_t HASH_STRING_PIECE(const char* string_piece) { + std::size_t result = 0; + while (*string_piece) { + result = (result * 131) + *string_piece++; + } + return result; +} + +constexpr size_t operator"" _H(const char* string_piece, size_t) { + return HASH_STRING_PIECE(string_piece); +} std::string gen_random_6() { static const char alphanum[] = "0123456789"; @@ -15,7 +23,6 @@ std::string gen_random_6() { tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)]; } - // return tmp_s; return "000000"; } @@ -47,18 +54,19 @@ SignalServer::SignalServer() { SignalServer::~SignalServer() {} bool SignalServer::on_open(websocketpp::connection_hdl hdl) { - connections_[hdl] = connection_id_; - LOG_INFO("New connection [{}] established", connection_id_++); + ws_connections_[hdl] = ws_connection_id_++; + LOG_INFO("New websocket connection [{}] established", ws_connection_id_); - json message = {{"type", "connection_id"}, {"connection_id", connection_id_}}; + json message = {{"type", "ws_connection_id"}, + {"ws_connection_id", ws_connection_id_}}; server_.send(hdl, message.dump(), websocketpp::frame::opcode::text); return true; } bool SignalServer::on_close(websocketpp::connection_hdl hdl) { - LOG_INFO("Connection [{}] closed", connection_id_++); - connections_.erase(hdl); + LOG_INFO("Websocket onnection [{}] closed", ws_connection_id_++); + ws_connections_.erase(hdl); return true; } @@ -94,67 +102,63 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, std::string payload = msg->get_payload(); auto j = json::parse(payload); - std::string type = j["type"]; - auto itr = siganl_types.find(type); - if (itr != siganl_types.end()) { - LOG_INFO("msg type: {}", itr->first); - switch (itr->second) { - case 1: { - transport_id_ = gen_random_6(); - LOG_INFO("Generate transport_id [{}]", transport_id_); - json message = {{"type", "transport_id"}, - {"transport_id", transport_id_}}; - send_msg(hdl, message); - break; - } - case 2: { - std::string transport_id = j["transport_id"]; - std::string sdp = j["sdp"]; - LOG_INFO("Save transport_id[{}] with offer sdp[{}]", transport_id, sdp); - offer_sdp_map_[transport_id] = sdp; - offer_hdl_map_[transport_id] = hdl; - break; - } - case 3: { - std::string transport_id = j["transport_id"]; - std::string sdp = offer_sdp_map_[transport_id]; - LOG_INFO("send offer sdp [{}]", sdp.c_str()); - json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; - send_msg(hdl, message); - break; - } - case 4: { - std::string transport_id = j["transport_id"]; - std::string sdp = j["sdp"]; - LOG_INFO("Save transport_id[{}] with answer sdp[{}]", transport_id, - sdp); - answer_sdp_map_[transport_id] = sdp; - answer_hdl_map_[transport_id] = hdl; - LOG_INFO("send answer sdp [{}]", sdp.c_str()); - json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; - send_msg(offer_hdl_map_[transport_id], message); - break; - } - case 5: { - std::string transport_id = j["transport_id"]; - std::string candidate = j["sdp"]; - LOG_INFO("send candidate [{}]", candidate.c_str()); - json message = {{"type", "candidate"}, {"sdp", candidate}}; - send_msg(answer_hdl_map_[transport_id], message); - break; - } - case 6: { - std::string transport_id = j["transport_id"]; - std::string candidate = j["sdp"]; - LOG_INFO("send candidate [{}]", candidate.c_str()); - json message = {{"type", "candidate"}, {"sdp", candidate}}; - send_msg(offer_hdl_map_[transport_id], message); - break; - } - default: - break; + + switch (HASH_STRING_PIECE(type.c_str())) { + case "create_transport"_H: { + transport_id_ = gen_random_6(); + LOG_INFO("Generate transport_id [{}]", transport_id_); + json message = {{"type", "transport_id"}, + {"transport_id", transport_id_}}; + send_msg(hdl, message); + break; } + case "offer"_H: { + std::string transport_id = j["transport_id"]; + std::string sdp = j["sdp"]; + LOG_INFO("Save transport_id[{}] with offer sdp[{}]", transport_id, sdp); + // ws_handle_manager_.BindHandleToConnection(hdl, ); + offer_sdp_map_[transport_id] = sdp; + offer_hdl_map_[transport_id] = hdl; + break; + } + case "query_remote_sdp"_H: { + std::string transport_id = j["transport_id"]; + std::string sdp = offer_sdp_map_[transport_id]; + LOG_INFO("send offer sdp [{}]", sdp.c_str()); + json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; + send_msg(hdl, message); + break; + } + case "answer"_H: { + std::string transport_id = j["transport_id"]; + std::string sdp = j["sdp"]; + LOG_INFO("Save transport_id[{}] with answer sdp[{}]", transport_id, sdp); + answer_sdp_map_[transport_id] = sdp; + answer_hdl_map_[transport_id] = hdl; + LOG_INFO("send answer sdp [{}]", sdp.c_str()); + json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; + send_msg(offer_hdl_map_[transport_id], message); + break; + } + case "offer_candidate"_H: { + std::string transport_id = j["transport_id"]; + std::string candidate = j["sdp"]; + LOG_INFO("send candidate [{}]", candidate.c_str()); + json message = {{"type", "candidate"}, {"sdp", candidate}}; + send_msg(answer_hdl_map_[transport_id], message); + break; + } + case "answer_candidate"_H: { + std::string transport_id = j["transport_id"]; + std::string candidate = j["sdp"]; + LOG_INFO("send candidate [{}]", candidate.c_str()); + json message = {{"type", "candidate"}, {"sdp", candidate}}; + send_msg(offer_hdl_map_[transport_id], message); + break; + } + default: + break; } // std::string sdp = j["sdp"]; diff --git a/tests/signal_server/signal_server.h b/tests/signal_server/signal_server.h index f19e575..1160b4f 100644 --- a/tests/signal_server/signal_server.h +++ b/tests/signal_server/signal_server.h @@ -8,6 +8,9 @@ #include #include +#include "sdp_manager.h" +#include "ws_handle_manager.h" + using nlohmann::json; typedef websocketpp::server server; @@ -37,14 +40,17 @@ class SignalServer { server server_; std::map> - connections_; + ws_connections_; std::map rooms_; - unsigned int connection_id_ = 0; + unsigned int ws_connection_id_ = 0; std::string transport_id_ = "000000"; std::map offer_sdp_map_; std::map answer_sdp_map_; std::map offer_hdl_map_; std::map answer_hdl_map_; + + WsHandleManager ws_handle_manager_; + SdpManager sdp_manager_; }; #endif \ No newline at end of file diff --git a/tests/signal_server/ws_handle_manager.cpp b/tests/signal_server/ws_handle_manager.cpp new file mode 100644 index 0000000..eef9cfe --- /dev/null +++ b/tests/signal_server/ws_handle_manager.cpp @@ -0,0 +1,5 @@ +#include "ws_handle_manager.h" + +WsHandleManager::WsHandleManager() {} + +WsHandleManager::~WsHandleManager() {} \ No newline at end of file diff --git a/tests/signal_server/ws_handle_manager.h b/tests/signal_server/ws_handle_manager.h new file mode 100644 index 0000000..4b9ee20 --- /dev/null +++ b/tests/signal_server/ws_handle_manager.h @@ -0,0 +1,24 @@ +#ifndef _WS_HANDLE_MANAGER_H_ +#define _WS_HANDLE_MANAGER_H_ + +#include +#include + +class WsHandleManager { + public: + WsHandleManager(); + ~WsHandleManager(); + + public: + bool BindHandleToConnection(websocketpp::connection_hdl hdl, + std::string& connection_id); + bool ReleaseHandleFromConnection(websocketpp::connection_hdl hdl, + std::string& connection_id); + + const std::string& GetConnectionId(websocketpp::connection_hdl hdl); + websocketpp::connection_hdl GetWsHandle(std::string& connection_id); + + private: +}; + +#endif \ No newline at end of file