用LPC实现进程通信.doc

用LPC实现进程通信.doc

ID:50931830

大小:78.00 KB

页数:9页

时间:2020-03-16

用LPC实现进程通信.doc_第1页
用LPC实现进程通信.doc_第2页
用LPC实现进程通信.doc_第3页
用LPC实现进程通信.doc_第4页
用LPC实现进程通信.doc_第5页
用LPC实现进程通信.doc_第6页
用LPC实现进程通信.doc_第7页
用LPC实现进程通信.doc_第8页
用LPC实现进程通信.doc_第9页
资源描述:

《用LPC实现进程通信.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、用LPC实现进程通信一.LPC的概念LPC即是”本地过程调用(LocalProcedureCall)”。二.LPC的原理端口是一种面向连接的通信机制,通信的双方需要先建立起“连接”。这种连接一般建立在用户进程之间。在建立了连接的双方之间有几种交换报文的方法:不带数据的纯报文。不大于256字节的短报文。如果是大于256字节的长报文,就要在双方之间建立两个共享内存区(Section)。双方通过共享内存区交换数据,但通过报文进行协调和同步。Tips:大块数据之所以要通过共享内存区交换,一来是因为这样就为用于Port机制的缓冲区设置了一个上限,便于内存管理。而更重要的

2、是提高了效率,因为否则便要在发送端把大块数据搬入内核空间,又在接收端把大块数据搬到用户空间。三.典型的LPC建立连接和通信过程如下:符号说明:S提供服务方(服务端)C请求服务方(客户端)S1、服务线程首先通过NtCreatePort()创建一个命名的连接端口、即Port对象(这个对象名应为客户线程所知).S2、建立上述连接端口后,服务线程通过NtListenPort()等待接收来自客户线程的连接请求(服务线程被阻塞).C1、客户线程通过NtConnectPort()创建客户方的无名通信端口,向上述命名的连接端口发出连接请求(客户线程阻塞)。S3、服务线程收到连

3、接请求(被唤醒)后,如果同意连接则通过NtAcceptConnectPort()创建服务方无名通信端口、接受连接、并返回该无名通信端口的handle。然后通过NtCompleteConnectPort()唤醒客户线程。C2、客户线程被唤醒、返回所创建的无名通信端口handle。S4、服务线程另创建一个新线程负责为客户线程提供服务。该线程因企图从上述通信端口接收报文、等待来自客户端的请求而阻塞。因此、新创建的线程是LPC服务线程,原来的服务线程是端口服务线程。S5、端口服务线程再次调用NtListenPort(),等待来自其它客户的连接请求。(S2---S5的循

4、环)C3、客户线程通过NtRequestWaitReplyPort()向服务方发送报文,请求得到LPC服务,并因等待而被阻塞。S6、LPC服务线程因接收到报文而被唤醒,并根据报文内容提供相应的LPC服务。S7、LPC服务线程通过NtReplyPort()向客户方发送回答报文。客户线程解除阻塞。LPC服务端LPC客户端NtCreatePort()NtListenPort()NtAcceptConnectPort()NtCompleteConnectPort()NtConnectPort()发送连接请求客户线程阻塞NtReplyPort()NtRequestWai

5、tReplyPort()唤醒客户线程数据传送NtClose()NtClose()服务线程阻塞服务线程被唤醒LPC建立连接和通信典型流程图LPC通信的报文结构定义如下:////DefineheaderforPortMessage//typedefstruct_PORT_MESSAGE{USHORTDataLength;//传输的数据的大小Lengthofdatafollowingtheheader(bytes)USHORTTotalLength;//传输的数据加PORT_MESSAGE的大小Lengthofdata+sizeof(PORT_MESSAGE)USH

6、ORTType;//传输的消息的类型Typeofthemessage(SeeLPC_TYPEenum)USHORTVirtualRangesOffset;//OffsetofarrayofvirtualaddressrangesCLIENT_IDClientId;//发送方进程ID和线程IDClientidentifierofthemessagesenderULONGMessageId;//报文消息IDIdentifieroftheparticularmessageinstanceunion{ULONGCallbackId;//ULONGClientViewS

7、ize;//发送方创建的共享区个数Size,inbytes,ofsectioncreatedbythesender};}PORT_MESSAGE,*PPORT_MESSAGE;NOTE:请求连接的一方对于将来要发送多大的数据量应该是心里有数的。如果数据是不大,那就可以作为附加信息随同报文(在同一个缓冲区中)中一起发送。但是,要是数据是比较大(报文总长大于256字节),那就要通过共享内存区"发送",(reason:1是传输效率低下,2、报文缓冲区的大小也不好静态地安排确定)。因此,在期望发送数据量比较大时要准备好一个共享内存区(Section)用于数据发送。这是

8、要由请求连接的一方、即客户方做好准备,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。