diff --git a/sip/WebSocketServer.cpp b/sip/WebSocketServer.cpp index b82a35b..198cfc4 100644 --- a/sip/WebSocketServer.cpp +++ b/sip/WebSocketServer.cpp @@ -25,13 +25,11 @@ int WebSocketServer::parse_invite(vector& vec_msg, std::string ip) { } else if (StringTools::to_lower(vec_msg[1]) == "tcp") { net_type = "tcp"; } - std::cout << "net type: " << vec_msg[1] << std::endl; - - std::cout << "invite " << vec_msg[2] << ":" << vec_msg[3] << std::endl; + + LOG_INFO("invite {}:{} net type: {}", vec_msg[2], vec_msg[3], vec_msg[1]); int ret = -100; if ("udp" == net_type) { ret = sip_server.RequestInvite_UDP(vec_msg[2].c_str(), ip.c_str(), atoi(vec_msg[3].c_str())); - // ret = sip_server.RequestInvite_UDP(vec_data[0].c_str(), "176.10.0.3", 30026); } else if ("tcp" == net_type) { /* code */ @@ -45,7 +43,7 @@ string WebSocketServer::get_ip_from_hdl(websocketpp::connection_hdl hdl) { // 获取客户端IP地址 auto addr = con->get_socket().remote_endpoint().address().to_string(); std::string ip = addr.substr(addr.find_last_of(":")+1); - std::cout << "ip:" << ip << endl; + LOG_DEBUG("ip:{}", ip); return ip; } @@ -58,26 +56,57 @@ int WebSocketServer::msg_parser(websocketpp::connection_hdl hdl, string msg) { string ip = get_ip_from_hdl(hdl); string response_msg = ""; - int ret = -100; if ( StringTools::to_lower(vec_msg[0]) == "invite") { ret = parse_invite(vec_msg, ip); - response_msg = vec_msg[2] + "_" + vec_msg[3] +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret); + string strKey = vec_msg[2] + "_" + vec_msg[3]; + if (ret > 0) { + std::lock_guard l_hdl(m_channelport_hdl_map_mtx); + m_channelport_hdl_map[strKey] = hdl; + } + + response_msg = strKey +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret); ws_server.send(hdl, response_msg, websocketpp::frame::opcode::text); } else if ( StringTools::to_lower(vec_msg[0]) == "bye") { if (StringTools::to_lower(vec_msg[1]) == "invite") { - std::cout << "bye invite: " << vec_msg[2] << std::endl; + LOG_INFO("BYE invite: {}", vec_msg[2]); + + std::lock_guard l_hdl(m_channelport_hdl_map_mtx); + string strKey = vec_msg[2] + "_" + vec_msg[3]; + auto it = m_channelport_hdl_map.find(strKey); + if (it != m_channelport_hdl_map.end()) { + m_channelport_hdl_map.erase(it); + } + ret = sip_server.ByeInvite(vec_msg[2], ip, atoi(vec_msg[3].c_str())); } } else { - std::cout << "on_message called with hdl: " << hdl.lock().get() - << " and message: " << msg - << std::endl; + LOG_ERROR("on_message called with hdl: {} and message:{}", hdl.lock().get(), msg); } return ret; } +void WebSocketServer::response_client(std::string sip_channel_id, int rtp_port, std::string net_type, int ret) { + + std::lock_guard l_hdl(m_channelport_hdl_map_mtx); + + string strKey = sip_channel_id + "_" + to_string(rtp_port); + auto it = m_channelport_hdl_map.find(strKey); + if (it == m_channelport_hdl_map.end()) { + return; + } + + try { + // invite + string response_msg = strKey +"|invite|" + net_type + "|" + to_string(ret); + ws_server.send(it->second, response_msg, websocketpp::frame::opcode::text); + } catch(const std::exception& e) { + // 存在一种可能:连接已经断开,但是sip那边请求失败,这种时候应该是会抛出异常。所以这里用try-cache,屏蔽此情况造成的问题 + LOG_WARN("response failed because::{}", e.what()); + } +} + // Define a callback to handle incoming messages void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr msg) { @@ -87,29 +116,37 @@ void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr ms } try { - int ret = msg_parser(hdl,msg->get_payload()); - // 返回执行结果 - // ws_server.send(hdl, to_string(ret), websocketpp::frame::opcode::text); + msg_parser(hdl,msg->get_payload()); } catch (websocketpp::exception const & e) { - std::cout << "Echo failed because: " << "(" << e.what() << ")" << std::endl; + LOG_ERROR("Echo failed because::{}", e.what()); ws_server.send(hdl, to_string(-101), websocketpp::frame::opcode::text); } } void WebSocketServer::on_open(websocketpp::connection_hdl hdl) { - // std::string msg = "hello"; - // c.send(hdl, msg, websocketpp::frame::opcode::text); - // c.get_alog().write(websocketpp::log::alevel::app, "Tx: " + msg); - std::cout << "连接sip服务器成功!" << std::endl; + LOG_INFO("连接sip服务器成功!"); } void WebSocketServer::on_fail(websocketpp::connection_hdl h){ - std::cout << "连接sip服务器失败!" << std::endl; + LOG_WARN("连接sip服务器失败!"); } void WebSocketServer::on_close(websocketpp::connection_hdl h){ - std::cout << "on_close" << std::endl; + LOG_INFO("on_close:{}", h.lock().get()); + + std::lock_guard l_hdl(m_channelport_hdl_map_mtx); + + for (auto it = m_channelport_hdl_map.begin(); it != m_channelport_hdl_map.end(); ) + { + server::connection_ptr con = ws_server.get_con_from_hdl(it->second); + server::connection_ptr con_std = ws_server.get_con_from_hdl(h); + if (con == con_std) { + it = m_channelport_hdl_map.erase(it); + } else { + it++; + } + } } @@ -123,7 +160,7 @@ void WebSocketServer::start() { ServerInfo info = pConfig->getServerCfg(); - sip_server.Init(&info); + sip_server.Init(&info, this); try { // Set logging settings @@ -141,7 +178,7 @@ void WebSocketServer::start() { // Listen on port 9002 int port = info.getWsPort(); - std::cout << "websocket server listen:" << port << std::endl; + LOG_INFO("websocket server listen:{}", port); ws_server.listen(port); // Start the server accept loop @@ -150,8 +187,8 @@ void WebSocketServer::start() { // Start the ASIO io_service run loop ws_server.run(); } catch (websocketpp::exception const & e) { - std::cout << e.what() << std::endl; + LOG_ERROR("websocket start failed:{}", e.what()); } catch (...) { - std::cout << "other exception" << std::endl; + LOG_ERROR("websocket start failed: other exception"); } } diff --git a/sip/WebSocketServer.h b/sip/WebSocketServer.h index 92de0e0..5f18132 100644 --- a/sip/WebSocketServer.h +++ b/sip/WebSocketServer.h @@ -1,7 +1,12 @@ +#ifndef __WEB_SOCKET_SERVER__ +#define __WEB_SOCKET_SERVER__ + #include #include #include "SipServer.h" +#include +#include typedef websocketpp::server server; @@ -24,6 +29,8 @@ public: void start(); + void response_client(std::string sip_channel_id, int rtp_port, std::string net_type, int ret); + private: int msg_parser(websocketpp::connection_hdl hdl, string msg); int parse_invite(vector& vec_msg, std::string ip); @@ -33,4 +40,9 @@ private: private: server ws_server; SipServer sip_server; -}; \ No newline at end of file + + std::map m_channelport_hdl_map; + std::mutex m_channelport_hdl_map_mtx; +}; + +#endif // __WEB_SOCKET_SERVER__ \ No newline at end of file