trans_service模块依赖于系统OS提供的网络socket服务,向认证模块提供认证通道管理和认证数据的收发;向业务模块提供session管理和基于session的数据收发功能,而且经过GCM模块的加密功能提供收发报文的加解密保护。网络
- 初始化的时机
在分布式软总线的设计中,trans_service模块是在authmanager模块中被初始化的,而authmanager模块又被discovery模块初始化,所以设备在向外发布本设备信息的过程当中,即完成了这三个相互关联模块的初始化动做。session
authmanager模块中存在StartBus()函数,其中,StartListener()函数负责为认证模块提供通道完成初始化,StartSession()函数负责初始化业务的session管理:socket
认证通讯与业务session的实现原理相似,本文中咱们以简单一些的认证通讯代码为例子,说明典型的处理流程。分布式
- 初始化入口 – StartListener
StartListener()函数的底层存在对应不一样版本平台的适配函数,这印证了鸿蒙OS各部分解耦的模块化设计思想,针对不一样的硬件设备,组合成最适合该设备的OS。好比建立线程时采用了统一的static void WaitProcess(void)函数,而其内部封装了不一样底层API的适配代码。模块化
StartListener()调用InitListenFd()函数完成监听TCP socket的建立和监听,其中IP地址和端口号由上层调用者指定。函数
如上文所述,AuthCreate()在不一样平台上会有不一样的实现,在LITEOS_A和Linux平台上, AuthCreate()会调用兼容POSIX的pthread_create()完成线程的建立,线程的入口函数为static void WaitProcess(void)。加密
- 监听新链接和数据 – WaitProcess
WaitProcess()使用忙等方式,调用select()来监听listenFd和数据g_dataFd的信息,若是监听到有数据可读,则进入ProcessAuthData来处理。spa
若是发现g_dataFd有异常信息,则将其关闭。其中g_dataFd是由listenFd监听到链接时建立的socket。
线程
- 处理新链接和数据 - ProcessAuthData
不管是新链接请求,仍是已有链接中有数据到来,均会进入本函数。设计
函数经过FD_ISSET()判断是不是listenFd上存在消息,若是是,则说明当前存在新的链接,这时调用accept()完成连接建立,新建立的socket的fd被存储在g_dataFd中,同时调用g_callback->onConnectEvent通知认证模块有新的链接事件发生,并将新建立的fd和client的IP地址告知认证模块。
与此同时,建立g_dataFd时候须要刷新g_maxFd,以保证在WaitProcess()中的下一次select()操做时中,会监听到g_dataFd上的事件。
若是FD_ISSET()判断出g_dataFd上存在消息,则说明已完成握手的链接向本节点发送了数据,这时函数回调g_callback->onDataEvent(),把控制权返回给调用者,以处理接收到的数据。
- 回调函数的处理
trans_service模块的使用者设置的回调函数将在存在新链接、和新数据时被调用,好比认证模块经过如下函数完成认证动做:OnConnectEvent()函数中完成对新链接的处理, OnDataEvent()函数中完成对新数据的处理。
- 业务的session管理
该部分代码负责业务的数据通讯,节点经过名称进行通讯,对外隐藏了端口信息,代码的实现原理与上面的认证通讯相似,针对业务需求增长了如多路通讯等方面的实现,这里再也不详细分析。