在上一篇《live555流媒体服务器在解决客户端异常掉线后没有释放相应资源问题的解决方法》的没有释放稍有区别,上一篇是某一个通道没有客户端访问了, 要释放相应资源,而今天要说的,是多个客户端访问同一路源, 其中某个客户端异常断电了(比如NVR断电), 上次的方法就不适用于这种情况了。
例如,两台电脑上分别打开一个客户端,连接EasyRTSPServer中的同一个源,在播放过程中,将一台电脑的网卡直接禁用(模拟突然掉电), 而另一台电脑上的客户端还在正常播放;
通过命令ss -ntp | grep 554 查看当前连接; 发现连接仍然在, 相应的socket没有被关闭,但通过打印可以看出,已经执行了RTSPClientSession的析构了, 而没有执行到RTSPClientConnection的析构;
顺便说一下: Windows环境下没有该问题, 只有Linux环境下会出现;
解决方法
在ClientSession中,保存相应的RTSPClientConnection的指针, 当ClientSession被析构时,创建一个延时任务来关闭相应的RTSPClientConnection, 代码如下:
void GenericMediaServer::ClientSession::CloseConnectionTask(ClientConnection *clientConnection)
{
if (NULL == clientConnection) return;
if (clientConnection->GetFlag() != LIVE_FLAG) return;
clientConnection->handleRequestBytes(-1, clientConnection->pClientConnectionEnv);
}