From e6e8605304938c9ec02d2e023b7e6f89bfd6eecc Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 8 Apr 2020 13:30:28 +0800 Subject: [PATCH] For #307, support config RTC session timeout --- trunk/conf/full.conf | 4 ++++ trunk/src/app/srs_app_config.cpp | 18 ++++++++++++++++++ trunk/src/app/srs_app_config.hpp | 2 ++ trunk/src/app/srs_app_rtc_conn.cpp | 10 +++++++++- trunk/src/app/srs_app_rtc_conn.hpp | 6 +++--- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index ef9bcb8dd..a4a901ab9 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -434,6 +434,10 @@ vhost rtc.vhost.srs.com { # discard Discard aac audio packet. # default: transcode aac transcode; + # The timeout in seconds for session timeout. + # Client will send ping(STUN binding request) to server, we use it as heartbeat. + # default: 30 + stun_timeout 30; } # whether enable min delay mode for vhost. # For RTC, we recommend to set to on. diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index b3523cd7c..62bf3f201 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -4780,6 +4780,24 @@ bool SrsConfig::get_rtc_aac_discard(string vhost) return conf->arg0() == "discard"; } +srs_utime_t SrsConfig::get_rtc_stun_timeout(string vhost) +{ + static srs_utime_t DEFAULT = 30 * SRS_UTIME_SECONDS; + + SrsConfDirective* conf = get_rtc(vhost); + + if (!conf) { + return DEFAULT; + } + + conf = conf->get("stun_timeout"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return (srs_utime_t)(::atoi(conf->arg0().c_str()) * SRS_UTIME_SECONDS); +} + SrsConfDirective* SrsConfig::get_vhost(string vhost, bool try_default_vhost) { srs_assert(root); diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 21fff23fe..ee1f81cef 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -525,11 +525,13 @@ public: virtual bool get_rtc_server_ecdsa(); virtual int get_rtc_server_sendmmsg(); virtual bool get_rtc_server_encrypt(); + virtual bool get_rtc_server_encrypt(); SrsConfDirective* get_rtc(std::string vhost); bool get_rtc_enabled(std::string vhost); bool get_rtc_bframe_discard(std::string vhost); bool get_rtc_aac_discard(std::string vhost); + srs_utime_t get_rtc_stun_timeout(std::string vhost); // vhost specified section public: diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 76a59eb95..bc1cf3b30 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -635,6 +635,9 @@ SrsRtcSession::SrsRtcSession(SrsRtcServer* rtc_svr, const SrsRequest& req, const cid = context_id; encrypt = true; + + // TODO: FIXME: Support reload. + sessionStunTimeout = _srs_config->get_rtc_stun_timeout(req.vhost); } SrsRtcSession::~SrsRtcSession() @@ -951,7 +954,7 @@ block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ srs_error_t SrsRtcSession::on_connection_established(SrsUdpMuxSocket* udp_mux_skt) { - srs_trace("rtc session=%s, connection established", id().c_str()); + srs_trace("rtc session=%s, timeout=%dms connection established", id().c_str(), srsu2msi(sessionStunTimeout)); return start_play(udp_mux_skt); } @@ -988,6 +991,11 @@ srs_error_t SrsRtcSession::start_play(SrsUdpMuxSocket* udp_mux_skt) return err; } +bool SrsRtcSession::is_stun_timeout() +{ + return last_stun_time + sessionStunTimeout < srs_get_system_time(); +} + srs_error_t SrsRtcSession::on_dtls(SrsUdpMuxSocket* udp_mux_skt) { return dtls_session->on_dtls(udp_mux_skt); diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index b4351d448..cf8aaf31f 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -65,8 +65,6 @@ const uint8_t kSLI = 2; const uint8_t kRPSI = 3; const uint8_t kAFB = 15; -const srs_utime_t kSrsRtcSessionStunTimeoutUs = 10*1000*1000LL; - enum SrsRtcSessionStateType { // TODO: FIXME: Should prefixed by enum name. @@ -169,6 +167,8 @@ private: // Sepcifies by HTTP API, query encrypt, optional. // TODO: FIXME: Support reload. bool encrypt; + // The timeout of session, keep alive by STUN ping pong. + srs_utime_t sessionStunTimeout; public: SrsRequest request; SrsSource* source; @@ -202,7 +202,7 @@ public: srs_error_t on_connection_established(SrsUdpMuxSocket* udp_mux_skt); srs_error_t start_play(SrsUdpMuxSocket* udp_mux_skt); public: - bool is_stun_timeout() { return last_stun_time + kSrsRtcSessionStunTimeoutUs < srs_get_system_time(); } + bool is_stun_timeout(); private: srs_error_t check_source(); private: