diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 627855bcb..de8d19df3 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1862,6 +1862,12 @@ srs_error_t SrsRtcConnection::on_connection_established() { srs_error_t err = srs_success; + // If DTLS done packet received many times, such as ARQ, ignore. + if(ESTABLISHED == state_) { + return err; + } + state_ = ESTABLISHED; + srs_trace("RTC: session pub=%u, sub=%u, to=%dms connection established", publishers_.size(), players_.size(), srsu2msi(session_timeout)); @@ -3008,6 +3014,13 @@ srs_error_t SrsRtcConnection::create_player(SrsRequest* req, std::mapstart())) { + return srs_error_wrap(err, "start player"); + } + } + return err; } @@ -3082,6 +3095,13 @@ srs_error_t SrsRtcConnection::create_publisher(SrsRequest* req, SrsRtcStreamDesc } } + // If DLTS done, start the publisher. Because maybe create some publishers after DTLS done. + if(ESTABLISHED == state()) { + if(srs_success != (err = publisher->start())) { + return srs_error_wrap(err, "start publisher"); + } + } + return err; }