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

一、概述

trans_service模块基于系统内核提供的socket通信,向authmanager模块提供设备认证通道管理和设备认证数据的传输;向业务模块提供session管理和基于session的数据收发功能,并且通过GCM模块的加密功能提供收发报文的加解密保护。 在上一篇博客 OpenHarmony源码分析之分布式软总线:trans_service模块(2)/会话管理之新会话 中已经介绍了在分布式软总线中TCP会话管理的部分内容,如TCP新会话的管理。本文将继续介绍会话管理的相关内容,重点在于TCP会话中的通信数据管理。

二、源码分析

  1. 在函数ProcessData(),根据套接字fd的状态判断是有新的连接请求,还是有新的数据到达,在之前的博客中已经介绍了前一种可能,接下来我们一起来看一下有新数据到达时,系统如何进行处理。在函数ProcessData()中:
scss 复制代码
/*
函数功能:处理新数据或者新连接
函数参数:
    tsm:会话管理器地址
    rfds:可读描述符集合
函数返回值:无
详细:
*/
static void ProcessData(TcpSessionMgr *tsm, fd_set *rfds)
{
    if (tsm == NULL || tsm->listenFd == -1) {
        return;
    }
    if (FD_ISSET(tsm->listenFd, rfds)) {//新连接到达
        ProcessConnection(tsm);//处理新会话连接事件
        return;
    }
    ProcessSesssionData(tsm, rfds);//处理tcp会话中的新数据到达事件
}
  1. 调用ProcessSesssionData()函数处理新数据。轮询会话管理器中每个会话的fd,看是否有数据到达。
rust 复制代码
/*
函数功能:处理每个会话的新数据
函数参数:
    tsm:会话管理器地址
    rfds:可读描述符集合
函数返回值:无
详细:
*/
static void ProcessSesssionData(const TcpSessionMgr *tsm, const fd_set *rfds)
{
    for (int i = 0; i < MAX_SESSION_SUM_NUM; i++) {
        if (tsm->sessionMap_[i] != NULL && tsm->sessionMap_[i]->fd != -1 &&
            FD_ISSET(tsm->sessionMap_[i]->fd, rfds) > 0) {//轮询每个会话的fd,看是否有数据到达
            if (!OnProcessDataAvailable(tsm->sessionMap_[i])) {//处理每个会话的新数据
                return;
            }
        }
    }
}

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()中处理每个会话的新数据。
arduino 复制代码
/*
函数功能:处理会话中新到达的数据
函数参数:
    session:tcp会话地址
函数返回值:
    成功:返回true
    失败:返回false
详细:
*/
static bool OnProcessDataAvailable(TcpSession *session)
{
    if (session == NULL) {
        return false;
    }
    if (strcmp(session->sessionName, "softbus_Lite_unknown") == 0) {//如果会话名称是默认名称,即是未知设备,表示这是一个新会话
        bool isSuccess = HandleRequestMsg(session);//处理请求消息
        if (!isSuccess) {
            CloseSession(session->fd);
        }
        return isSuccess;
    } else {
        unsigned char* buf = calloc(1, RECIVED_BUFF_SIZE);
        if (buf == NULL) {
            return false;
        }
        SOFTBUS_PRINT("[TRANS] OnProcessDataAvailable sessionName: %s, fd: %d\n", session->sessionName, session->fd);
        SessionListenerMap *sessionListener = GetSessionListenerByName(session->sessionName,
            strlen(session->sessionName));//根据会话名字在会话管理器的会话监听器表中查找相应会话监听器
        if (sessionListener != NULL && sessionListener->listener != NULL) {//若会话监听器已存在,则表明该会话已创建
            int recvLen = TcpSessionRecv(session, (char *)buf, RECIVED_BUFF_SIZE, 0);//接收会话新数据并进行解密,返回明文数据
            if (recvLen < 0) {
                free(buf);
                return false;
            }
            sessionListener->listener->onBytesReceived(session->fd, buf, recvLen);//通知会话监听器,数据已收到
            free(buf);
            return true;
        }
        free(buf);
    }
    return false;
}

具体的处理过程将在下一篇博客中详细介绍,未完待续。

相关推荐
lbb 小魔仙33 分钟前
【HarmonyOS实战】React Native 表单实战:在 OpenHarmony 上构建高性能表单
react native·华为·harmonyos
北京迅为43 分钟前
《【北京迅为】itop-3568开发板NPU使用手册》- 第 7章 使用RKNN-Toolkit-lite2
linux·人工智能·嵌入式·npu
一只大侠的侠3 小时前
React Native开源鸿蒙跨平台训练营 Day16自定义 useForm 高性能验证
flutter·开源·harmonyos
早點睡3904 小时前
高级进阶 React Native 鸿蒙跨平台开发:@react-native-community-slider 滑块组件
react native·react.js·harmonyos
一只大侠的侠4 小时前
Flutter开源鸿蒙跨平台训练营 Day11从零开发商品详情页面
flutter·开源·harmonyos
一只大侠的侠5 小时前
React Native开源鸿蒙跨平台训练营 Day18自定义useForm表单管理实战实现
flutter·开源·harmonyos
一只大侠的侠5 小时前
React Native开源鸿蒙跨平台训练营 Day20自定义 useValidator 实现高性能表单验证
flutter·开源·harmonyos
听麟6 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
前端世界6 小时前
从单设备到多设备协同:鸿蒙分布式计算框架原理与实战解析
华为·harmonyos
一只大侠的侠7 小时前
Flutter开源鸿蒙跨平台训练营 Day12从零开发通用型登录页面
flutter·开源·harmonyos