From 48b1d025fc8393e06ce6b1b4daa16230058b84ba Mon Sep 17 00:00:00 2001 From: dijunkun Date: Wed, 11 Oct 2023 17:30:29 +0800 Subject: [PATCH] Fix crash caused by server leave and rejoin --- application/signal_server/signal_server.cpp | 9 ++++++++- src/ice/ice_agent.cpp | 3 +++ src/pc/peer_connection.cpp | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/application/signal_server/signal_server.cpp b/application/signal_server/signal_server.cpp index d26308d..19f0e74 100644 --- a/application/signal_server/signal_server.cpp +++ b/application/signal_server/signal_server.cpp @@ -176,7 +176,6 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, std::string user_id = j["user_id"].get(); LOG_INFO("[{}] leaves transmission [{}]", user_id.c_str(), transmission_id.c_str()); - transmission_manager_.ReleaseUserIdFromTransmission(hdl); json message = {{"type", "user_leave_transmission"}, {"transmission_id", transmission_id}, @@ -189,6 +188,14 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, send_msg(transmission_manager_.GetWsHandle(user_id), message); } + transmission_manager_.ReleaseUserIdFromTransmission(hdl); + if (std::string::npos != user_id.find("S-")) { + transmission_list_.erase(transmission_id); + transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); + LOG_INFO("Release transmission [{}] due to server leaves", + transmission_id); + } + break; } case "query_user_id_list"_H: { diff --git a/src/ice/ice_agent.cpp b/src/ice/ice_agent.cpp index 36b7b75..fcb1412 100644 --- a/src/ice/ice_agent.cpp +++ b/src/ice/ice_agent.cpp @@ -143,5 +143,8 @@ int IceAgent::SetRemoteGatheringDone() { } int IceAgent::Send(const char *data, size_t size) { + if (juice_state_t::JUICE_STATE_COMPLETED != juice_get_state(agent_)) { + return -1; + } return juice_send(agent_, data, size); } \ No newline at end of file diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 2c4f359..f23b77f 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -223,6 +223,8 @@ int PeerConnection::Leave() { transmission_id_); } + ice_ready_ = false; + for (auto &user_id_it : ice_transmission_list_) { user_id_it.second->DestroyIceTransmission(); } @@ -312,6 +314,7 @@ void PeerConnection::ProcessSignal(const std::string &signal) { if (user_id_it != ice_transmission_list_.end()) { user_id_it->second->DestroyIceTransmission(); ice_transmission_list_.erase(user_id_it); + ice_ready_ = false; LOG_INFO("Terminate transmission to user [{}]", user_id); if (std::string::npos != user_id.find("S-")) {