往期推文看点
- 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
- 鸿蒙(HarmonyOS)北向开发知识点记录~
- 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
- 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
- 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
- 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
- 记录一场鸿蒙开发岗位面试经历~
- 持续更新中……
一、概述
tcp_session.c文件提供的接口功能主要是创建一个TCP会话并返回其地址,在tcp_session.h文件中还提供了会话的属性结构体,本文将对这两个文件进行详细分析。
二、源码分析
- tcp_session.h
/*
* Copyright (c) 2020 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TCP_SESSION_H
#define TCP_SESSION_H
#include "comm_defs.h"
#include "common_info_manager.h"
#define NAME_LENGTH 64 //名称长度
#define SESSION_KEY_LENGTH 32 //会话密钥长度
/*会话数据包序列号节点*/
typedef struct {
List head;
int seqNum;
} SessionSeqNumNode;
/*tcp会话相关属性结构体*/
typedef struct {
char sessionName[NAME_LENGTH];//会话名称
char deviceId[MAX_DEV_ID_LEN];//设备id
char groupId[NAME_LENGTH];//组id
char sessionKey[SESSION_KEY_LENGTH];//会话密钥
long seqNum;//节点序号
int fd;//通信套接字fd
int busVersion;//总线版本
int routeType;//路由类型
bool isAccepted;
List *seqNumList;//数据包序号链表,用于记录数据包的序列号
} TcpSession;
TcpSession* CreateTcpSession(void);
#endif // TCP_SESSION_H
- tcp_session.c
/*
* Copyright (c) 2020 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tcp_session.h"
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/socket.h>
#include "os_adapter.h"
/*
函数功能:创建一个新的tcp会话并进行相关属性初始化
函数参数:无
函数返回值:
成功:返回tcp会话结构体地址
失败:返回NULL
详细:
*/
TcpSession *CreateTcpSession(void)
{
TcpSession *tcpSession = (TcpSession *)malloc(sizeof(TcpSession));//申请会话地址空间
if (tcpSession == NULL) {
return NULL;
}
if (strcpy_s(tcpSession->sessionName, NAME_LENGTH, "softbus_Lite_unknown") != 0) {//为新会话初始化名字
SOFTBUS_PRINT("[TRANS] CreateTcpSession cpy busname fail\n");
free(tcpSession);
return NULL;
}
//初始化TCP会话结构体的相关属性:
(void)memset_s(tcpSession->deviceId, MAX_DEV_ID_LEN, 0, MAX_DEV_ID_LEN);//清空设备id空间
(void)memset_s(tcpSession->groupId, NAME_LENGTH, 0, NAME_LENGTH);//清空组id空间
(void)memset_s(tcpSession->sessionKey, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);//清空会话密钥空间
tcpSession->seqNum = 0;//初始化节点序号为0
tcpSession->fd = -1;//初始化套接字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;
}