RCF—用于C++的进程间通讯(1)
#include RCFRcfServer.hpp
#include RCFTcpEndpoint.hpp
RCF_BEGIN(I_Echo, I_Echo)
RCF_METHOD_R1(std::string, echo, const std::string &)
RCF_END(I_Echo)
class Echo
...{
public:
std::string echo(const std::string &s)
...{
return s;
}
};
int main()
...{
Echo echo;
RCF::RcfServer server(RCF::TcpEndpoint(50001));
server.bind<I_Echo>(echo);
server.startInThisThread();
return 0;
}
#include <RCF/TcpEndpoint.hpp>
RCF_BEGIN(I_Echo, "I_Echo")
RCF_METHOD_R1(std::string, echo, const std::string &)
RCF_END(I_Echo)
int main()
...{
RcfClient<I_Echo> echoClient(RCF::TcpEndpoint("localhost", 50001));
std::string s = echoClient.echo(RCF::Twoway, "what's up");
return 0;
}
RcfServer::start(
false)
然后重复调用RcfServer::cycle()
来达到相同的效果。在多线程版本中,也可以调用RcfServer::start()
,然后驱动服务器的现场将会被自动创建。多线程版本需要Boost.Threads
库,并且要定义RCF_USE_BOOST_THREADS
预处理符号。
#include <RCF/RcfServer.hpp>
#include <RCF/UdpEndpoint.hpp>
#ifndef RCF_USE_BOOST_THREADS
#error Need to build with RCF_USE_BOOST_THREADS
#endif
RCF_BEGIN(I_Echo, "I_Echo")
RCF_METHOD_R1(std::string, echo, const std::string &)
RCF_END(I_Echo)
class Echo
...{
public:
std::string echo(const std::string &s)
...{
return s;
}
};
int main()
...{
Echo echo;
RCF::RcfServer server(RCF::UdpEndpoint(50001));
server.bind<I_Echo>(echo);
server.start();
RcfClient<I_Echo> echoClient(RCF::UdpEndpoint("127.0.0.1", 50001));
std::string s = echoClient.echo(RCF::Twoway, "what's up");
server.stop(); // would happen anyway as server object goes out of scope
return 0;
}
RCF_BEGIN()
宏用给定的名字和运行时描述来开始一个接口的定义,RCF_END()
宏来结束接口定义。在两者中间,用RCF_METHOD_xx()
宏可以定义一共25个接口的成员方法。
RCF_METHOD_xx()
宏的后两个字母表示参数的个数和返回类型是否是一个void。比如说,RCF_METHOD_V3
用来定义一个三个参数返回值类型为void的方法。
RcfClient
<type
>类,这里的type
是这个接口的名字。这个类直接用作客户端的客户端桩,间接地用作服务器端的服务桩。RCF的接口也可以定义在任意的名字空间内:
...{
namespace B
...{
RCF_BEGIN(I_X, "I_X")
RCF_METHOD_V0(void, func1)
RCF_METHOD_R5(int, func2, int, int, int, int, int)
RCF_METHOD_R0(std::auto_ptr<std::string>, func3)
RCF_METHOD_V2(void, func4,
const boost::shared_ptr<std::string> &,
boost::shared_ptr<std::string> &)
// ..
RCF_END(I_X)
}
}
int main()
...{
A::B::RcfClient<A::B::I_X> client;
// or
A::B::I_X::RcfClient client;
// ...
}
RcfServer::bind()
方法来实现这个绑定。根据内存管理方式的不同,绑定有几种变化。下面的几种调用都可以实现一模一样的事情:把一个Echo
对象绑定到I_Echo
接口上。
// bind to an object...
Echo echo;
server.bind<I_Echo>(echo);
// or to a std::auto_ptr<>...
std::auto_ptr<Echo> echoAutoPtr(new Echo());
server.bind<I_Echo>(echoAutoPtr);
// or to a boost::shared_ptr<>...
boost::shared_ptr<Echo> echoPtr(new Echo());
server.bind<I_Echo>(echoPtr);
// or to a boost::weak_ptr<>...
boost::weak_ptr<Echo> echoWeakPtr(echoPtr);
server.bind<I_Echo>(echoWeakPtr);
}
RcfServer server(endpoint);
// bind first object
Echo echo1;
server.bind<I_Echo>(echo1, "Echo1");
// bind second object
Echo echo2;
server.bind<I_Echo>(echo2, "Echo2");
server.start();
RcfClient<I_Echo> echoClient(endpoint);
echoClient.getClientStub().setServerBindingName("Echo1");
std::cout << echoClient.echo("this was echoed by the echo1 object");
echoClient.getClientStub().setServerBindingName("Echo2");
std::cout << echoClient.echo("this was echoed by the echo2 object");
}
RCF—用于C++的进程间通讯(1)相关推荐
- RCF—用于C++的进程间通讯(3)
过滤器(Filters) RCF通过过滤器的概念来支持对消息的压缩和加密.过滤器需要同时应用于服务器端和客户端.也可以被应用于传输层,例如应用SSL过滤器到向TCP这样基于流的传输:或者应用于独立的消 ...
- RCF—用于C++的进程间通讯(4)
可扩展性 传输 对于前一个版本的RCF,一个(应得的)批评是关于它和TCP协议过度紧密的关系.现在RCF采用了传输无关的设计,并且对于初用者,可以使用它支持的TCP和UDP协议.更重要的是,它的架构很 ...
- Android-Binder进程间通讯机制-多图详解
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- Android(IPC)进程间通讯1:详解Binder由来?
完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...
- linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- Linux 进程间通讯方式 pipe()函数
Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6-&g ...
- 进程间通讯SendMessage
PostMessage貌似只能用于进程内通讯,不同进程间通讯可以用SendMessage和共享内存等方式.这里理出SendMessage的用法,方便日后查阅. 发送消息的进程代码: const UIN ...
最新文章
- 基于CUDA实现立方体贴图 (Cubemaps) 转换为全景图 (Equirectangular Panorama)
- 在WinAPI环境下获得1小时前系统时间
- JS数组与对象的遍历方法大全
- 讲解SQL Server定时作业job的设置方法
- instr函数 mysql_mysql数据库中查找字串出现的位置instr函数
- Windows Phone 7 自定义弹出窗口
- Github 简明教程 - 操作标签
- java 执行查询_在单个语句中用Java执行多个查询
- ERROR 1290 (HY000): The MySQL server is running withnbs
- 历届二级c语言pdf,历年全国计算机二级C语言题库.pdf
- 使用 Iperf 测试软路由性能
- 心形函数的几种表达式
- AM调制时域代码matlab,AM调制的FPGA实现
- 《精通python设计模式》读书笔记之——行为型设计模式
- 记梦之三:我成了萧峰
- Python可视化基础----从0学会matplotlib折线图,条形图,散点图
- 2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)
- MCV 和 MTV框架基本信息
- Microsoft Visual Studio 2019介绍之使用入门
- Scalar数据类型
热门文章
- java早餐点餐外卖网站系统
- 堡垒机JumpServer(六):内网管理云端服务器
- 006网易-表达式求值
- 大尺寸共阴数码管驱动电路
- 微信小程序 开发 “婚礼邀请函” 微信小程序入门可看
- 迅雷【任务配置文件错误,无法继续下载】解决方法
- 交通信息服务器图片,交通标志图片大全(图文解释)
- 前端开发者应该知道的 Centos/Dokcer/Nginx/Node/Jenkins 操作( 长文)
- electron中引入iohook来监听系统级鼠标键盘事件
- BeanUtils.populate(Object Bean,Map properties)