使用C++模板实现不需要IDL的RPC
IDL的数据定义由几个宏定义实现:
RPC_DECLARE_MF(FunName, ArgList)
|
声明函数,ArgList必须带括号
|
BEGIN_RPC_ADD_MF_EX(ThisClass,ClassName)
BEGIN_RPC_ADD_MF(ThisClass)
|
开始注册函数
EX后缀可以使用指定的名字作为类名称
|
RPC_ADD_MF(FunName)
|
注册一个函数
|
END_RPC_ADD_MF()
|
结束注册
|
用起来很类似于微软MFC中的消息映射声明。
实现上有过几次改动:
初始完成
|
l 每个ClientStub都有一个Stub的引用和一个真实的Stub实例
l Server端的Servant对象没有名字,用到哪个类,自动创建一个该类对象
l 参数序列化时,除非明确指定rpc_in/rpc_out/rpc_inout,否则都是双向传送
l 第一次调用远程函数时使用名字调用,以后都使用ID调用
l 只有同步调用(Client等待Server返回)
|
第二次改动
|
l 使用模板偏特化,自动推导参数的传送方式
l 实现了异步调用
|
目前状态
|
l Server端可以有GlobaleScope和SessionScope对象
l Global对象在Server整个运行期间都存在【除非显式删除】
l Session对象仅在一个会话中有效,会话结束就被删除
l Client可以创建、查询GlobaleScope和SessionScope的Servant
l Client/Server本身也使用这种rpc声明方式(rpc_interface.h)
l Server启动时可以注册一些驻留的GlobaleScope对象,这些对象由用户创建后调用rpc_server.add_servant(obj,name)注册
|
通信对象也被看做一个SessionScope对象,在客户端,这个对象由rpc_client表示,在服务端,由RpcSession表示。这个对象的ID是1,连接建立起来之后,两端就都把自己放入SessionScope对象池。这样,就可以方便地使用rpc_interface.h中定义的函数。这个过程相当于自己的bootstrap。但是,在Server上销毁RpcSession对象时,需要先把自己从SessionScope对象池中删除,然后再销毁SessionScope对象池中的所有对象。
client.h[.cpp]
|
rpc客户端实现
|
server.h[.cpp]
|
rpc服务端实现
|
rpc_basic.h
|
rpc基本类型定义
|
client_io.h
|
客户端io
|
server_io.h
|
服务端io
|
rpc_interface.h
|
客户端/服务端接口定义
|
arg_traits.h
|
推导rpc参数,函数原型推导为rpc io参数
|
pp_arglist_type.h
|
arglist
|
偏特化,用来配合boost.pp生成模板代码
|
pp_client_stub.h
|
客户端桩函数
|
pp_server_stub.h
|
服务端桩函数
|
函数参数的推导(以T为未修饰类型):
T
|
rpc_in<T>
|
输入参数,只被传入,不被传出
|
const T
|
rpc_in<T>
|
const T&
|
rpc_in<T>
|
const T*
|
rpc_in<T>
|
T&
|
rpc_inout<T>
|
输入/输出参数,既被传入,又被传出
|
T*
|
rpc_out<T>
|
输出参数,不被传入,只被传出
|
remote_object
|
的派生类另外处理
|
只传把对象ID作为输入参数传递
|
要做这个推导的原因是:C++在传递参数时,T会隐式转换成T&或者const T&,如果T是一个临时对象(std::string getstr() 的返回值),可能会转化成const T&,如果不是临时变量(如void fun(int x)中的x),会推导为T&,从而,在将它传给输入输出函数时会引发不确定性。而通过推导,可以区分T的所有不同修饰,从而在输入输出时做到正确识别。
实现上,能放在.cpp中实现的,都尽量放在.cpp中,不能在.cpp中实现的,才放在.h中。rpc_client和rpc_server都可以通过模板参数来修改Input/Output的方式,目前可用的是二进制,也许将来可以使用文本(如XML rpc,JsonRPC)。
项目地址:http://code.google.com/p/febird
分享到:
相关推荐
febird.rpc is a C++ remote procedure call without an IDL supporting, it based on the serialization framework. febird.rpc provide convenient usage and fast performance, and an uniform coding style. ...
远程过程调用(RPC,Remote Procedure Call)是分布式计算领域中的一个重要概念,它允许一个程序在不理解底层网络实现的情况下,能够调用另一个网络上的程序的功能,就像它们在同一台计算机上执行一样。RPC大大简化...
小红薯电商实操课小红书开店实操必学课.mp4
AI图像处理工具包-一键抠图、背景切换、旧照片修复、人像漫画化、视频卡通化(Python+OpenCV+Dlib+TensorFlow).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!
基于java的新能源充电系统设计与实现.docx
吸波材料建模单元周期仿真模拟,参数优化,计算反射损耗,极化角,入射角,等效阻抗等
AGV调度系统的仿真平台(含源码+项目说明+实验结果分析).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!
【本体】Internet Download Manager v6.42.26.zip
NLP中文垃圾短信分类系统源码+设计全部资料+文档报告(自然语言处理课设).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!
Python大作业封面.doc
基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业),个人经导师指导并认可通过的毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开
操作系统课后题参考答案
几何图霸软件是一个非常强大的三维几何图形绘制工具,可以根据约束条件绘制标准示意图,写相关技术类文章需要绘图时很适用。
《写给大众的健康饮食指南》.mp4
智能相册Piktures v2.19 build 815 for 高级版.mp4
建行开养老金必中58元微信立减金亲测.mp4
Converter视频音频转换器v2.2.5.2解锁VIP版.mp4
车来了v4.59.0高级版 精准实时公交地铁神器.mp4
基于java的招生宣传管理系统设计与实现.docx