From dfaa2ccf0a34f99054df63277b02156a1d5595f1 Mon Sep 17 00:00:00 2001 From: zhutao04 Date: Tue, 14 Nov 2023 19:07:29 +0800 Subject: [PATCH] =?UTF-8?q?rtp=E9=80=9A=E8=BF=87udp=E6=8E=A8=E6=B5=81?= =?UTF-8?q?=E9=89=B4=E6=9D=83=E5=A4=B1=E8=B4=A5=E5=90=8E=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BB=B6=E6=97=B6=E6=96=AD=E5=BC=80=EF=BC=8C=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E6=89=80=E6=9C=89=E6=95=B0=E6=8D=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtp/RtpProcess.cpp | 4 ++++ src/Rtp/RtpProcess.h | 1 + src/Rtp/RtpSession.cpp | 11 +++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index 5e61ccf4..3855f411 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -79,6 +79,9 @@ bool RtpProcess::inputRtp(bool is_udp, const Socket::Ptr &sock, const char *data WarnP(this) << "Not rtp packet"; return false; } + if (!_auth_err.empty()) { + throw toolkit::SockException(toolkit::Err_other, _auth_err); + } if (_sock != sock) { // 第一次运行本函数 bool first = !_sock; @@ -260,6 +263,7 @@ void RtpProcess::emitOnPublish() { strong_self->doCachedFunc(); InfoP(strong_self) << "允许RTP推流"; } else { + strong_self->_auth_err = err; WarnP(strong_self) << "禁止RTP推流:" << err; } }); diff --git a/src/Rtp/RtpProcess.h b/src/Rtp/RtpProcess.h index 860be01c..3e87620a 100644 --- a/src/Rtp/RtpProcess.h +++ b/src/Rtp/RtpProcess.h @@ -94,6 +94,7 @@ private: private: bool _only_audio = false; + std::string _auth_err; uint64_t _dts = 0; uint64_t _total_bytes = 0; std::unique_ptr _addr; diff --git a/src/Rtp/RtpSession.cpp b/src/Rtp/RtpSession.cpp index 82f3c72a..70c8dc7a 100644 --- a/src/Rtp/RtpSession.cpp +++ b/src/Rtp/RtpSession.cpp @@ -139,8 +139,15 @@ void RtpSession::onRtpPacket(const char *data, size_t len) { } else { throw; } - } catch (...) { - throw; + } catch (std::exception &ex) { + if (!_is_udp) { + // tcp情况下立即断开连接 + throw; + } + // udp情况下延时断开连接(等待超时自动关闭),防止频繁创建销毁RtpSession对象 + WarnP(this) << ex.what(); + _delay_close = true; + return; } _ticker.resetTime(); }