提交 ea0d9c73 编写于 作者: xengine-qyt's avatar xengine-qyt

fixed:clean client resource is incorrent when client close

上级 bd3e5f86
......@@ -122,6 +122,20 @@ extern "C" bool ModuleSession_PullStream_GetStreamType(LPCXSTR lpszClientAddr, E
备注:
*********************************************************************/
extern "C" bool ModuleSession_PullStream_Delete(LPCXSTR lpszClientAddr);
/********************************************************************
函数名称:ModuleSession_PullStream_Delete
函数功能:删除整个推流端关联的拉流地址
参数.一:lpszClientAddr
In/Out:In
类型:常量字符指针
可空:N
意思:输入要处理的客户端
返回值
类型:逻辑型
意思:是否成功
备注:
*********************************************************************/
extern "C" bool ModuleSession_PullStream_PublishDelete(LPCXSTR lpszClientAddr);
/*********************************************************************************
* 推流端导出会话模块 *
*********************************************************************************/
......
......@@ -103,6 +103,44 @@ bool CModuleSession_PullStream::ModuleSession_PullStream_Delete(LPCXSTR lpszClie
return true;
}
/********************************************************************
函数名称:ModuleSession_PullStream_Delete
函数功能:删除整个推流端关联的拉流地址
参数.一:lpszClientAddr
In/Out:In
类型:常量字符指针
可空:N
意思:输入要处理的客户端
返回值
类型:逻辑型
意思:是否成功
备注:
*********************************************************************/
bool CModuleSession_PullStream::ModuleSession_PullStream_PublishDelete(LPCXSTR lpszClientAddr)
{
Session_IsErrorOccur = false;
if (NULL == lpszClientAddr)
{
Session_IsErrorOccur = true;
Session_dwErrorCode = ERROR_STREAMMEDIA_MODULE_SESSION_PARAMENT;
return false;
}
st_Locker.lock();
for (auto stl_MapIterator = stl_MapClient.begin(); stl_MapIterator != stl_MapClient.end(); )
{
if (0 == _tcsxnicmp(lpszClientAddr, stl_MapIterator->second->tszSMSAddr, _tcsxlen(lpszClientAddr)))
{
stl_MapIterator = stl_MapClient.erase(stl_MapIterator);
}
else
{
stl_MapIterator++;
}
}
st_Locker.unlock();
return true;
}
/********************************************************************
函数名称:ModuleSession_PullStream_GetSMSAddr
函数功能:获取客户端绑定的流ID
参数.一:lpszClientAddr
......
......@@ -29,6 +29,7 @@ public:
bool ModuleSession_PullStream_GetPushAddr(LPCXSTR lpszClientAddr, XCHAR* ptszPushAddr);
bool ModuleSession_PullStream_GetStreamType(LPCXSTR lpszClientAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE* penStreamType);
bool ModuleSession_PullStream_Delete(LPCXSTR lpszClientAddr);
bool ModuleSession_PullStream_PublishDelete(LPCXSTR lpszClientAddr);
private:
shared_mutex st_Locker;
private:
......
......@@ -8,6 +8,7 @@ EXPORTS
ModuleSession_PullStream_GetPushAddr
ModuleSession_PullStream_GetStreamType
ModuleSession_PullStream_Delete
ModuleSession_PullStream_PublishDelete
ModuleSession_PushStream_Create
ModuleSession_PushStream_Destroy
......
......@@ -51,6 +51,10 @@ extern "C" bool ModuleSession_PullStream_Delete(LPCXSTR lpszClientAddr)
{
return m_PullStream.ModuleSession_PullStream_Delete(lpszClientAddr);
}
extern "C" bool ModuleSession_PullStream_PublishDelete(LPCXSTR lpszClientAddr)
{
return m_PullStream.ModuleSession_PullStream_PublishDelete(lpszClientAddr);
}
/*********************************************************************************
* 推流导出会话模块 *
*********************************************************************************/
......
......@@ -142,6 +142,23 @@ void CALLBACK Network_Callback_SRTLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket,
//////////////////////////////////////////////////////////////////////////网络IO关闭操作
void XEngine_Network_Close(LPCXSTR lpszClientAddr, XSOCKET hSocket, bool bHeart, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE enClientType)
{
XCHAR tszSMSAddr[MAX_PATH];
XCHAR tszPushAddr[MAX_PATH];
memset(tszSMSAddr, '\0', sizeof(tszSMSAddr));
memset(tszPushAddr, '\0', sizeof(tszPushAddr));
//可能是推流也可能是拉流
if (ModuleSession_PullStream_GetPushAddr(lpszClientAddr, tszPushAddr))
{
ModuleSession_PullStream_Delete(lpszClientAddr);
ModuleSession_PushStream_ClientDelete(tszPushAddr, lpszClientAddr);
}
if (ModuleSession_PushStream_GetAddrForAddr(lpszClientAddr, tszSMSAddr))
{
ModuleSession_PullStream_PublishDelete(tszSMSAddr);
ModuleSession_PushStream_Destroy(lpszClientAddr);
}
if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP == enClientType)
{
//先关闭网络和心跳,他们主动回调的数据我们可以不用主动调用关闭
......@@ -155,19 +172,6 @@ void XEngine_Network_Close(LPCXSTR lpszClientAddr, XSOCKET hSocket, bool bHeart,
}
//需要主动删除与客户端对应的组包器队列中的资源
HttpProtocol_Server_CloseClinetEx(xhHttpPacket, lpszClientAddr);
//停止拉流
XCHAR tszSMSAddr[MAX_PATH];
XCHAR tszPushAddr[MAX_PATH];
memset(tszSMSAddr, '\0', sizeof(tszSMSAddr));
memset(tszPushAddr, '\0', sizeof(tszPushAddr));
ModuleSession_PullStream_GetSMSAddr(lpszClientAddr, tszSMSAddr);
if (ModuleSession_PullStream_GetPushAddr(lpszClientAddr, tszPushAddr))
{
ModuleSession_PullStream_Delete(lpszClientAddr);
ModuleSession_PushStream_ClientDelete(tszPushAddr, lpszClientAddr);
}
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,离开服务器"), lpszClientAddr);
}
else if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_XSTREAM == enClientType)
......@@ -185,7 +189,6 @@ void XEngine_Network_Close(LPCXSTR lpszClientAddr, XSOCKET hSocket, bool bHeart,
HelpComponents_Datas_DeleteEx(xhXStreamPacket, lpszClientAddr);
//停止推流
XEngine_AVPacket_AVDelete(lpszClientAddr);
ModuleSession_PushStream_Destroy(lpszClientAddr);
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("XEngine推流端:%s,离开服务器,心跳标志:%d"), lpszClientAddr, bHeart);
}
else if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078 == enClientType)
......@@ -211,43 +214,12 @@ void XEngine_Network_Close(LPCXSTR lpszClientAddr, XSOCKET hSocket, bool bHeart,
{
SocketOpt_HeartBeat_DeleteAddrEx(xhRTMPHeart, lpszClientAddr);
}
XCHAR tszSMSAddr[MAX_PATH];
XCHAR tszPushAddr[MAX_PATH];
memset(tszSMSAddr, '\0', sizeof(tszSMSAddr));
memset(tszPushAddr, '\0', sizeof(tszPushAddr));
//可能是推流也可能是拉流
ModuleSession_PullStream_GetSMSAddr(lpszClientAddr, tszSMSAddr);
if (ModuleSession_PullStream_GetPushAddr(lpszClientAddr, tszPushAddr))
{
ModuleSession_PullStream_Delete(lpszClientAddr);
ModuleSession_PushStream_ClientDelete(tszPushAddr, lpszClientAddr);
}
else
{
RTMPProtocol_Parse_Delete(lpszClientAddr);
XEngine_AVPacket_AVDelete(lpszClientAddr);
ModuleSession_PushStream_Destroy(lpszClientAddr);
}
RTMPProtocol_Parse_Delete(lpszClientAddr);
XEngine_AVPacket_AVDelete(lpszClientAddr);
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RTMP推流端:%s,离开服务器,心跳标志:%d"), lpszClientAddr, bHeart);
}
else if (ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_SRT == enClientType)
{
XCHAR tszSMSAddr[MAX_PATH];
XCHAR tszPushAddr[MAX_PATH];
memset(tszSMSAddr, '\0', sizeof(tszSMSAddr));
memset(tszPushAddr, '\0', sizeof(tszPushAddr));
//可能是推流也可能是拉流
if (ModuleSession_PullStream_GetPushAddr(lpszClientAddr, tszPushAddr))
{
ModuleSession_PullStream_Delete(lpszClientAddr);
ModuleSession_PushStream_ClientDelete(tszPushAddr, lpszClientAddr);
}
if (ModuleSession_PushStream_GetAddrForAddr(lpszClientAddr, tszSMSAddr))
{
ModuleSession_PushStream_Destroy(lpszClientAddr);
}
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("SRT客户端:%s,离开服务器,心跳标志:%d"), lpszClientAddr, bHeart);
}
}
......
......@@ -65,7 +65,6 @@ void ServiceApp_Stop(int signo)
ManagePool_Thread_NQDestroy(xhRTMPPool);
ManagePool_Thread_NQDestroy(xhJT1078Pool);
//销毁其他资源
srt_cleanup();
HelpComponents_XLog_Destroy(xhLog);
if (NULL != pst_AFile)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册