一、 概述
trans_service模块基于系统内核提供的socket通信,向authmanager模块提供设备认证通道管理和设备认证数据的传输;向业务模块提供session管理和基于session的数据收发功能,并且通过GCM模块的加密功能提供收发报文的加解密保护。
二、 源码分析
- 入口函数为StartListener(),主要是针对Linux系统内核,其它系统之后会有补充,解析如下
/*
函数功能: 启动监听其他设备的连接请求或者新数据响应
函数参数:callback 回调函数的地址;ip 需要绑定的server端ip地址
函数返回值:返回建立TCP连接的套接字的port
详细:监听器的主要作用是监听新连接请求和已建立连接的数据通信。
1.首先作为server端产生监听套接字fd,然后绑定端口和IP,这里的端口绑定采用了动态分配的方式。
2.然后创建子线程执行监听任务,采用的是select的io复用方式来处理并发请求。
*/
int StartListener(BaseListener *callback, const char *ip)
{
if (callback == NULL || ip == NULL) {
return -DBE_BAD_PARAM;
}
g_callback = callback;
//产生并初始化监听描述符,传入的SESSIONPORT为0,绑定0端口号的意义在于动态选取本地可用端口号,不用考虑端口重用的问题
int rc = InitListenFd(ip, SESSIONPORT);
if (rc != DBE_SUCCESS) {
return -DBE_BAD_PARAM;
}
//捕获SIGPIPE信号,SIG_IGN表示忽视该信号,不执行SIGPIPE默认操作:终止程序
signal(SIGPIPE, SIG_IGN);
//初始化线程属性,"auth"为线程名,线程栈大小为0x800 | MIN_STACK_SIZE,单位为字节,线程优先级为20
ThreadAttr attr = {
"auth", 0x800, 20, 0, 0};
//创建子线程进行监听任务,包括设备认证过程中的新连接或者新数据
register ThreadId threadId = (ThreadId)AuthCreate((Runnable)WaitProcess, &attr);
if (threadId == NULL) {
//创建子线程失败,则返回-1
SOFTBUS_PRINT("[TRANS] StartListener AuthCreate fail\n");
return -1;
}
//返回建立TCP连接的套接字的port,因为这里绑定的端口是0,其实是内核随机分配的端口号
return GetSockPort(g_listenFd);
}
- 调用 InitListenFd() 函数产生并初始化监听套接字fd
/*
函数功能: 产生并初始化监听描述符
函数参数:ip server端IP地址;port server端端口
函数返回值:成功返回0,失败返回错误码
详细:
*/
static int InitListenFd(const char *ip, int port)//
{
if (ip == NULL || g_listenFd != -1) {
return -DBE_BAD_PARAM;
}
if (strncmp