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

使用了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));
	}

	
  
	
}

一定要注意错误的处理

一定要注意错误的处理

一定要注意错误的处理

你可能感兴趣的:(流媒体,c++,boost)