在上一篇《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);
}