RtspServer icon indicating copy to clipboard operation
RtspServer copied to clipboard

RtspServer Bug

Open BreakingY opened this issue 1 year ago • 3 comments

一、TaskScheduler::HandleTriggerEvent()应该加锁,多线程下有内存泄漏风险 二、RtpConnection::SendRtpPacket(MediaChannelId channel_id, RtpPacket pkt):----客户端关闭的时候如果有音视频数据要发送时候会引发死锁 ok √ 原因如下: RtpConnection::SendRtpPacket中如果通过AddTriggerEvent发送数据,步骤如下: ... 1、TaskScheduler::AddTriggerEvent lock-->unlock 2、TaskScheduler::HandleTriggerEvent lock 3、执行RtpConnection::SendRtpPacket中设置的回调函数 4、调用TcpConnection::Send函数发送数据,lock TcpConnection::mutex_ 客户端关闭流程如下: 1、epoll触发TcpConnection::HandleClose()函数,lock TcpConnection::mutex_ 2、TcpConnection调用回调函数disconnect_cb_和close_cb_ disconnect_cb_由TcpServer注册 3、TcpServer注册的回调函数通过AddTriggerEvent调用TcpServer::RemoveConnection删除客户端缓存,TaskScheduler::AddTriggerEvent lock 问题出现了: 发送数据时候:TaskScheduler lock-->TcpConnection lock 客户端关闭时候:TcpConnection lock-->TaskScheduler lock 出现死锁 解决方式: 1、RtpConnection::SendRtpPacket中不使用AddTriggerEvent 2、TcpServer构造函数中不使用AddTriggerEvent 三、TimerQueue::HandleTimerEvent():如果超时,定时器队列中的数据没有被删除,导致内存泄露 四、RtspConnection::HandleCmdSetup()中rtcp_channels_[channel_id]->SetReadCallback(rtcp_fd, this { this->HandleRtcp(rtcp_fd); });也有问题 此时rtcp_fd是UDP,而HandleRtcp中是对客户端的tcp socket接受数据,实际并没有处理RTCP数据,因此这里不影响正常运行,可忽略。

BreakingY avatar Aug 27 '24 10:08 BreakingY

可以分享一下你的修复commit吗?

DeguiLiu avatar Sep 24 '24 03:09 DeguiLiu

没有commit,你就按照上面提出来的改就行

BreakingY avatar Sep 24 '24 06:09 BreakingY

解决方式: 1、RtpConnection::SendRtpPacket中不使用AddTriggerEvent 2、TcpServer构造函数中不使用AddTriggerEvent 请问这2个修改能再详细一点吗,不使用AddTriggerEvent的话,用那个接口代替呢

yukuilong avatar Jul 08 '25 05:07 yukuilong