OpenHarmony源码分析之分布式软总线:trans_service模块(2)/会话管理之新会话

本文深入分析OpenHarmony trans_service模块的会话管理,特别是新会话建立过程。从CreateTcpSessionMgr()函数开始,经过初始化、OpenTcpServer()、StartSelectLoop()以及SelectSessionLoop()等步骤,详细解读了如何处理新TCP连接,创建并管理会话。
摘要由CSDN通过智能技术生成

一、 概述

trans_service模块基于系统内核提供的socket通信,向authmanager模块提供设备认证通道管理和设备认证数据的传输;向业务模块提供session管理和基于session的数据收发功能,并且通过GCM模块的加密功能提供收发报文的加解密保护。
在之前的博客OpenHarmony源码分析之分布式软总线:trans_service模块/认证通道管理中已经对认证通道管理的相关源码进行了详细的分析,因此本文重点介绍trans_service模块提供的第二个功能——会话管理。在OpenHarmony中,设备间的数据传输是基于TCP会话机制实现的,而在这一模块中主要是提供对会话的相关管理,接下来我们将重点分析关于新会话建立的相关源码。

二、 源码分析

  1. 此模块的入口函数为 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);
}
  1. 在上述函数中,首先进行会话管理器的初始化,在函数 InitGSessionMgr() 中实现,代码分析如下:
/*
函数功能:初始化全局会话管理器的属性,包括内存空间、各个属性的初始值
函数参数:无
函数返回值:
    成功:返回0
    失败:返回失败码
详细:
*/
static int InitGSessionMgr(void)
{
   
    if (g_sessionMgr != NULL) {
   //若g_sessionMgr不为NULL,表示已存在会话管理器
        return 0;
    }

    g_sessionMgr = malloc(sizeof(TcpSessionMgr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值