一、 概述
trans_service模块基于系统内核提供的socket通信,向authmanager模块提供设备认证通道管理和设备认证数据的传输;向业务模块提供session管理和基于session的数据收发功能,并且通过GCM模块的加密功能提供收发报文的加解密保护。
在之前的博客OpenHarmony源码分析之分布式软总线:trans_service模块/认证通道管理中已经对认证通道管理的相关源码进行了详细的分析,因此本文重点介绍trans_service模块提供的第二个功能——会话管理。在OpenHarmony中,设备间的数据传输是基于TCP会话机制实现的,而在这一模块中主要是提供对会话的相关管理,接下来我们将重点分析关于新会话建立的相关源码。
二、 源码分析
- 此模块的入口函数为 CreateTcpSessionMgr() ,该函数的主要功能是创建会话管理器。源码分析如下:
/*
函数功能:创建设备之间的TCP通信会话的管理器
函数参数:
asServer:是否作为server端
localIp:设备IP
函数返回值:
成功:返回绑定的端口号
失败:返回失败码
详细:
*/
int CreateTcpSessionMgr(bool asServer, const char* localIp)
{
if (localIp == NULL) {
//若设备IP为NULL则返回失败码
return TRANS_FAILED;
}
if (InitTcpMgrLock() != 0 || GetTcpMgrLock() != 0) {
//初始化锁并加锁
return TRANS_FAILED;
}
int ret = InitGSessionMgr();//初始化全局会话管理器
if (ReleaseTcpMgrLock() != 0 || ret != 0) {
//解锁
FreeSessionMgr();
return TRANS_FAILED;
}
g_sessionMgr->asServer = asServer;
//初始化server端套接字,生成监听套接字fd,并绑定IP和port
int listenFd = OpenTcpServer(localIp, DEFAULT_TRANS_PORT);
if (listenFd < 0) {
SOFTBUS_PRINT("[TRANS] CreateTcpSessionMgr OpenTcpServer fail\n");
FreeSessionMgr();
return TRANS_FAILED;
}
//将该套接字fd从CLOSED转换到LISTEN状态,监听client端(主动端)发起的连接信息
int rc = listen(listenFd, LISTEN_BACKLOG);
if (rc != 0) {
SOFTBUS_PRINT("[TRANS] CreateTcpSessionMgr listen fail\n");
CloseSession(listenFd);
FreeSessionMgr();
return TRANS_FAILED;
}
g_sessionMgr->listenFd = listenFd;//赋值全局会话管理器的监听套接字描述符
//捕获SIGPIPE信号,SIG_IGN表示忽视该信号,不执行SIGPIPE默认操作:终止程序。此处是为了防止对端突然关闭socket引起程序终止。
signal(SIGPIPE, SIG_IGN);
if (StartSelectLoop(g_sessionMgr) != 0) {
//创建子线程启动select循环监听
SOFTBUS_PRINT("[TRANS] CreateTcpSessionMgr StartSelectLoop fail\n");
CloseSession(listenFd);
FreeSessionMgr();
return TRANS_FAILED;
}
return GetSockPort(listenFd);
}
- 在上述函数中,首先进行会话管理器的初始化,在函数 InitGSessionMgr() 中实现,代码分析如下:
/*
函数功能:初始化全局会话管理器的属性,包括内存空间、各个属性的初始值
函数参数:无
函数返回值:
成功:返回0
失败:返回失败码
详细:
*/
static int InitGSessionMgr(void)
{
if (g_sessionMgr != NULL) {
//若g_sessionMgr不为NULL,表示已存在会话管理器
return 0;
}
g_sessionMgr = malloc(sizeof(TcpSessionMgr