boost::asio::deadline_timer异步handler频繁进入的问题

博客讨论了在使用Boost库构建流媒体服务器时遇到的问题,前端摄像机掉线后,多个播放器重连可能导致boost::asio::deadline_timer失效,触发handler频繁执行,日志快速增长。问题源于定时器处理函数忽视了错误码检查,每次调用都会重新设置定时器。解决方案是将定时器的重新设置放入错误判断内部,确保只有在无错误时才会启动新的计时。修复此问题可以避免日志风暴,优化服务器性能。
摘要由CSDN通过智能技术生成

使用了boost库完成了流媒体服务器,在使用过程中反馈如下问题:

前端摄像机掉线,流媒体服务器执行摄像机掉线处理后,等待播放器重连;如果多个播放器同时执行重连时,会不定时出现boost::asio::deadline_timer失效,导致handler会频繁的进入,然后日志文件快速增长,占用大量的磁盘空间,查看日志文件可看到每秒400条以上的handler执行记录。

通过不断测试发现,多个播放器重连时,会偶然导致以下代码段执行多次

 

m_timer.expires_from_now(boost::posix_time::seconds(10));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCPCmd, this,boost::asio::placeholders::error));

m_timer在未超时时,如果再次执行,会导致m_timer失效,handler会频繁的进入。

经过查找代码发现,定时器处理函数里面忽略了错误码的判断,不管正常与否,都再次重新设置了定时器,以定时发送RTCP数据包。

错误代码如下:

void SendRTCP(const boost::system::error_code& ec)
{
	
	if (!ec)
	{
		
        ...
        SendRequest(tmp);
        ...
		
	}

	
    m_timer.expires_from_now(boost::posix_time::seconds(40));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCP,this,boost::asio::placeholders::error));
	
}

修改后,将定时重新设置代码放入到判断错误的代码段里面

void SendRTCP(const boost::system::error_code& ec)
{
	
	if (!ec)
	{
		
        ...
        SendRequest(tmp);
        ...
		
  m_timer.expires_from_now(boost::posix_time::seconds(40));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCP,this,boost::asio::placeholders::error));
	}

	
  
	
}

一定要注意错误的处理

一定要注意错误的处理

一定要注意错误的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值