Symbian IPC client-server 框架
2010-04-20 16:00:00 来源:WEB开发网1、client组织代码启动server。
2、在手机启动的过程中自动启动,比如ETEL。自动启动server都是在system boot过程中执行的,参见symbian手机启动过程。
Server启动后马上创建CServer2对象,然后调用Start()使CServer2处于接收message的状态,同时在kernel会有一个对应的kernel server对象被创建。Kernel server对象拥有一个FIFO message队列,里面的message依次发送到CServer2对象。
无论如何client端都需要从RSessionBase派生一个类。就RSessionBase这个类本身来说主要做三件事情:a)创建与 server交互的session;b)与server交互;c)设置session共享的级别。而其派生类主要实现地是利用RSessionBase提供的基础接口与sever交互的功能,这与具体是需求有关系,每个不同的需求都会有不同的实现,这里就不讨论派生类了。
Client调用RSessionBase::CreateSession创建与server交互的session,并与server建立连接。这个过程中同时创建了kernel端的session对象,这个kernel对象也有一个FIFO message队列,比较奇怪吧?想想为什么。此时如果server还没有启动,CreateSession会失败,就需要client组织代码启动 server。到这里大家明白了吧,RSessionBase封装的handle就是kernel session对象,client与server交互的环境。在这个过程中还调用了NewSessionL()创建CSession2对象。
到现在为止client与server连接起来,可以进行交互了。下面说说交互的过程。
Client调用Sendxxx这类函数与server交互,它们都使用了那个handle,将message首先放入了kernel session对象的消息队列,之所以放入到这里是因为client-server框架有一个非常重要承诺:就算server死掉了,client发送给 server的message都会有返回。随后kernel再将message转发到kernel server的消息队列中,此时kernel激活user端的CServer2对象,CServer2收到后,会将接受到的message发送给 CSession2对象。随后的处理过程就是大家熟悉的过程了。
该到RSubSessionBase出场的时候了。我认为IPCv2的共享的特性主要体现在这个类上。大家对RFs和RFile这两个类比较熟悉吧,RFs建立起于F32的连接,然后若干个RFile共享这个RFs与F32进行交互。RSubSessionBase封装的handle实现与 CSession2中,由用户定义。
不同进程之间共享session通过SetParameter实现的,具体过程以后讨论吧。
更多精彩
赞助商链接