Skip to content

Commit a12ddbb

Browse files
committed
fix rtc over tcp crash when stop rtc publish.
@see #4220
1 parent 7951bf3 commit a12ddbb

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

trunk/src/app/srs_app_rtc_network.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,10 +713,12 @@ SrsRtcTcpConn::SrsRtcTcpConn(ISrsProtocolReadWriter* skt, std::string cip, int p
713713
delta_->set_io(skt_, skt_);
714714
session_ = NULL;
715715
pkt_ = new char[SRS_RTC_TCP_PACKET_MAX];
716+
_srs_rtc_manager->subscribe(this);
716717
}
717718

718719
SrsRtcTcpConn::~SrsRtcTcpConn()
719720
{
721+
_srs_rtc_manager->unsubscribe(this);
720722
srs_freepa(pkt_);
721723
srs_freep(delta_);
722724
srs_freep(skt_);
@@ -808,6 +810,23 @@ srs_error_t SrsRtcTcpConn::cycle()
808810
return srs_success;
809811
}
810812

813+
void SrsRtcTcpConn::on_before_dispose(ISrsResource* c)
814+
{
815+
SrsRtcConnection* session = dynamic_cast<SrsRtcConnection*>(c);
816+
if (session && session == session_) {
817+
if (session_->tcp()->is_establelished()) {
818+
session_->tcp()->set_state(SrsRtcNetworkStateClosed);
819+
session_->expire();
820+
}
821+
822+
session_ = NULL;
823+
}
824+
}
825+
826+
void SrsRtcTcpConn::on_disposing(ISrsResource* c)
827+
{
828+
}
829+
811830
srs_error_t SrsRtcTcpConn::do_cycle()
812831
{
813832
srs_error_t err = srs_success;

trunk/src/app/srs_app_rtc_network.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class SrsRtcTcpNetwork: public ISrsRtcNetwork
232232
};
233233

234234
// For WebRTC over TCP.
235-
class SrsRtcTcpConn : public ISrsConnection, public ISrsCoroutineHandler, public ISrsExecutorHandler
235+
class SrsRtcTcpConn : public ISrsConnection, public ISrsCoroutineHandler, public ISrsExecutorHandler, public ISrsDisposingHandler
236236
{
237237
private:
238238
// Because session references to this object, so we should directly use the session ptr.
@@ -277,6 +277,10 @@ class SrsRtcTcpConn : public ISrsConnection, public ISrsCoroutineHandler, public
277277
// Interface ISrsCoroutineHandler
278278
public:
279279
virtual srs_error_t cycle();
280+
// Interface ISrsDisposingHandler
281+
public:
282+
virtual void on_before_dispose(ISrsResource* c);
283+
virtual void on_disposing(ISrsResource* c);
280284
private:
281285
virtual srs_error_t do_cycle();
282286
srs_error_t handshake();

0 commit comments

Comments
 (0)