IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 鸿蒙源码分析(八) -> 正文阅读

[系统运维]鸿蒙源码分析(八)

设备认证模块下的session机制tcp_session文件分析

本篇主要分析模块一中trans_service目录下tcp_session.h+.c代码。(tcp_socket理论篇)
文件路径(模块一\communication_softbus_lite-master\trans_service\source\libdistbus\tcp_session.c)

一、session机制

1.session
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖。
2. 理解session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
3. session常见问题
3.1创建时间
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用时才被创建。
3.2 删除时间
综合前面的讨论,session在下列情况下被删除:

  • 调用删除程序
  • 距离上一次收到客户端发送的session id时间间隔超过了session的超时设置
  • 服务器进程被停止(非持久session)

3.3 存放对象
session里面存放的对象不是必需序列化的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。

二、代码分析

1. 头文件tcp_session.h

主要分析tcp_session.h中一些数据定义和结构体定义。
宏定义

#define NAME_LENGTH         64//会话名字长度
#define SESSION_KEY_LENGTH  32//会话密钥长度

结构体

typedef struct {
    List head;//定义一个head链表
    int seqNum;//序列值
} SessionSeqNumNode;

typedef struct {
    //tcp_session
    char sessionName[NAME_LENGTH]; //会话名
    char deviceId[MAX_DEV_ID_LEN]; //用来存放硬件设备id
    char groupId[NAME_LENGTH]; //群组id
    char sessionKey[SESSION_KEY_LENGTH]; //用来存放会话密钥,长度32
    long seqNum; //序列值
    int fd; //定义套接字描述符
    int busVersion; //总线的版本
    int routeType; //路由装置类型
    bool isAccepted; //bool变量,用来记录是否为tcp连接状态                              
    List *seqNumList; //定义一个序列值链表
} TcpSession;

函数声明

TcpSession* CreateTcpSession(void);
//tcp_session.c中的函数声明

源文件tcp_session.c

知识点:
在这里插入图片描述
在这里插入图片描述
代码分析

TcpSession *CreateTcpSession(void)//该函数用来创建TCP会话
{
    TcpSession *tcpSession = (TcpSession *)malloc(sizeof(TcpSession));
    //动态申请一个TcpSession结构体数组
    if (tcpSession == NULL) {
        return NULL;
        //申请失败的处理
    }
    if (strcpy_s(tcpSession->sessionName, NAME_LENGTH, "softbus_Lite_unknown") != 0) {
        //将softbus_Lite_unknown复制到(tcpSession->sessionName指针指定的内存空间NAME_LENGTH
        SOFTBUS_PRINT("[TRANS] CreateTcpSession cpy busname fail\n");//报错输出
        free(tcpSession);
        //使用malloc函数必须使用free函数来进行释放
        return NULL;
    }
    (void)memset_s(tcpSession->deviceId, MAX_DEV_ID_LEN, 0, MAX_DEV_ID_LEN);
    //将tcpSession->deviceId到 tcpSession->deviceId+MAX_DEV_ID_LEN中内容全部初始化
    (void)memset_s(tcpSession->groupId, NAME_LENGTH, 0, NAME_LENGTH);
    (void)memset_s(tcpSession->sessionKey, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
    //将tcpSession->deviceId,tcpSession->groupId,tcpSession->sessionKey指定内存中内容初始化为0

    tcpSession->seqNum = 0;
    tcpSession->fd = -1;
    tcpSession->busVersion = 0;
    tcpSession->routeType = 0;
    tcpSession->isAccepted = false;
    tcpSession->seqNumList = malloc(sizeof(List));
    //对结构体中元素进行初始化值
    if (tcpSession->seqNumList == NULL) {
        free(tcpSession);
        //申请失败,释放空间,并且函数退出
        return NULL;
    }
    ListInitHead(tcpSession->seqNumList);
    return tcpSession;//返回创建的tcp_session结构体
}

以上为tcp会话机制理论知识和相关代码分析,感谢阅读。tcp_socket通信机制点击此处查看

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:10:24  更:2021-08-02 11:12:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 6:37:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码