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

一、概述

trans_service模块基于系统内核提供的socket通信,向authmanager模块提供设备认证通道管理和设备认证数据的传输;向业务模块提供session管理和基于session的数据收发功能,并且通过GCM模块的加密功能提供收发报文的加解密保护。 本文是分布式软总线的会话管理机制的结尾部分,在前文中介绍了新会话中客户端请求数据的处理过程,本文重点介绍普通会话中的新数据处理。衔接OpenHarmony源码分析之分布式软总线:trans_service模块(5)/TCP会话管理 。

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。

erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

二、源码分析

  1. 在函数OnProcessDataAvailable()中,先根据会话名称进行判断,该设备是否属于未知设备,如果不是,将进行常规处理。首先根据会话名字在会话管理器的会话监听器表中查找相应会话监听器,若会话监听器已存在,则表明该会话已创建,然后在TcpSessionRecv()中接收会话新数据并进行解密,返回明文数据。TcpSessionRecv()函数的具体分析如下:
ini 复制代码
/*
函数功能:接收TCP会话新数据,并进行解密
函数参数:
    session:tcp通信会话
    buf:用于存储接收到并解密成功的明文数据
    size:除去OVERHEAD_LEN部分的数据长度
    timeout:超时时间
函数返回值:
    成功:返回实际接收到的明文数据长度
    失败:返回TRANS_FAILED(-1)
详细:
*/
static int32_t TcpSessionRecv(TcpSession *session, const char* buf, uint32_t size, int timeout)
{
    if (buf == NULL || session == NULL || session->fd < 0 || size <= 0 || timeout < 0) {
        return TRANS_FAILED;
    }
    char *recvDataBuf = calloc(1, size + OVERHEAD_LEN);
    if (recvDataBuf == NULL) {
        return TRANS_FAILED;
    }
    int recvSize = TcpRecvData(session->fd, recvDataBuf, size + OVERHEAD_LEN, 0);//接收TCP数据保存在recvDataBuf中,预读取size + OVERHEAD_LEN的数据量,返回实际读到的数据量
    if (recvSize < TRANS_PACKET_HEAD_SIZE) {
        FreeSessionRecvMem(recvDataBuf, session);
        return TRANS_FAILED;
    }
    long long seq = 0;
    AesGcmCipherKey cipherKey = {0};
    cipherKey.keybits = GCM_KEY_BITS_LEN_256;//采用256位的密钥加解密
    int ret = memcpy_s(&seq, SIZE_OF_LONG_LONG, recvDataBuf + TRANS_SEQ_NUM_OFFSET, SIZE_OF_LONG_LONG);//获取数据包的序列号
    ret += memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, session->sessionKey, SESSION_KEY_LENGTH);//赋予会话密钥
    ret += memcpy_s(cipherKey.iv, IV_LEN, recvDataBuf + TRANS_PACKET_HEAD_SIZE, IV_LEN);//赋予会话iv值
    if (ret != 0) {
        FreeSessionRecvMem(recvDataBuf, session);
        return TRANS_FAILED;
    }
    SessionSeqNumNode* node = calloc(1, sizeof(SessionSeqNumNode));
    if (node == NULL) {
        FreeSessionRecvMem(recvDataBuf, session);
        return TRANS_FAILED;
    }
    node->seqNum = seq;//赋予数据包序列号
    ListInsertTail(session->seqNumList, &(node->head));//将该数据包序列号节点插入seqNumList链表尾部
    int plainLen = DecryptTransData(&cipherKey, (unsigned char*)(recvDataBuf + TRANS_PACKET_HEAD_SIZE),
        recvSize - TRANS_PACKET_HEAD_SIZE, (unsigned char*)buf, size);//解密传输数据,解密后的明文保存在buf中
    free(recvDataBuf);
    if (plainLen <= 0) {
        return TRANS_FAILED;
    }
    return plainLen;
}
相关推荐
2501_920931701 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
摘星编程3 小时前
React Native鸿蒙版:Drawer抽屉导航实现
react native·react.js·harmonyos
lbb 小魔仙4 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY9:获取分类数据并渲染
flutter·华为·harmonyos
mocoding4 小时前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
2501_920931704 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
qq_177767376 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88216 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
小雨青年8 小时前
鸿蒙 HarmonyOS 6 | 系统能力 (06) 构建现代化通知体系 从基础消息到实况
华为·harmonyos
木斯佳8 小时前
HarmonyOS 6实战(源码解析篇):音乐播放器的音频焦点管理(上)——AudioSession与打断机制
华为·音视频·harmonyos
2601_949593659 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos