在上一篇文章RPC通信框架——RCF介绍中,介绍了RCF的优点,本篇文章从头开始演示如何用RCF编写一个跨进程通信的Demo程序。

将RCF编译为静态库

从官网下载到的源码中包含一个RCF的项目,但是这项目是用来编译动态库的。可以参考这个项目来进行静态库的设置。

首先创建一个空的项目文件,然后设置编译为静态库,添加源文件RCF.cpp,只需要这一个文件就够了,因为,这个文件里面,包含了其他所有的源文件。这种源代码的引用方式,编译为动态库,还可以接受,但是编译为静态库就会有一些问题,后面的文章中再讨论,不影响Demo的演示。

然后添加预处理器:

WIN32_LEAN_AND_MEAN
_WIN32_WINNT=0x0500

禁用特定警告(不是必须的):

4275
4251
4510
4511
4512
4127
4702

添加附加依赖项:

ws2_32.lib

这样就可以编译静态库了。

Client、Server项目配置

Client、Server的项目配置,首先是非常常见的引用RCF静态库的路径等配置,需要注意的一点就是需要添加如下预处理器:

WIN32_LEAN_AND_MEAN
_WIN32_WINNT=0x0500

编写接口定义

项目配置好后,需要添加Client、Server通信的功能,而他们通信是基于事先定义好的接口的,定义如下:

#pragma once

#include "rcf/rcf.hpp"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std; RCF_BEGIN(I_HELLO, "I_HELLO")
RCF_METHOD_V1(void, SayHello, const string&)
RCF_METHOD_R1(int, add, int&)
RCF_METHOD_V0(void, test)
RCF_END(I_HELLO)

编写接口的Server实现

接口的定义是用来规定通信支持的功能,以及通信的协议。有了这些规定后,就需要来实现具体的功能,并且这是属于Server端的实现,Client端无需知道这些实现的细节,代码如下:

#pragma once

#include "rcf/rcf.hpp"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
#include "hello.h" class HelloImpl
{
public:
void SayHello(const string& world)
{
cout << "hello " << world << endl;
}
int add(int& a)
{
a = a + a;
return a + 2;
}
void test()
{}
};

编写Server服务

那么接下来,需要编写一个控制台或者Windows服务来承载此Server服务,这里就选择简单的控制台程序。

RCF在Windows下支持三种通信协议:TCP、UDP、命名管道,

此处我们选择TCP:

#include "stdafx.h"
#include "hello.h" int _tmain(int argc, _TCHAR* argv[])
{
RCF::RcfInitDeinit rcf_init;
HelloImpl hello;
RCF::RcfServer server(RCF::TcpEndpoint(50001));
server.bind<I_HELLO>(hello);
server.start(); while(true)
{
Sleep(1000);
} return 0;
}

如代码所示,在程序入口,需要通过RcfInitDeinit类的构造函数,进行RCF相关的初始化,程序退出时,通过RcfInitDeinit的析构函数进行RCF的清理工作。

RCF初始化后,通过RcfServer的bind方法,绑定接口对应的具体实现,然后通过start方法启动服务。

编写Client程序

Client程序,在调用RCF相关方法之前,也需要通过RcfInitDeinit进行初始化工作,代码如下:

#include "stdafx.h"
#include "hello.h"
#include "stop_watch.h"
int _tmain(int argc, _TCHAR* argv[])
{
RCF::RcfInitDeinit rcf_init; RcfClient<I_HELLO> client(RCF::TcpEndpoint(50001));
string str = "test";
client.SayHello(str);
int a = 3;
int b = client.add(a);
cout << "a = " << a << ", b = " << b << endl; stop_watch watch;
watch.start();
for (int i = 0; i < 20000; ++i)
{
client.test();
}
watch.stop();
cout << watch.elapsed_ms() << " ms" << endl; return 0;
}

简单性能测试

在我的笔记本 Windows7 专业版 SP1 x64 、Intel(R) Core(TM) i5-2450M CPU @ 2.5GHz、 12G内存 的机器上,通过此Demo,对RCF进行了测试。

调用两万次,耗时1647ms左右,平均每秒可以调用12143次,平均每次调用耗时82微妙。

计时工具——stop_watch

计时工具 stop_watch类,可以参考C++高精度计时器——微秒级时间统计

参考资料

RCF User Guide

RCF进程间通信Demo程序的更多相关文章

  1. c# winform 点菜宝接口demo程序

    前几天写了一篇关于c#调用 win32API的文章,有同学对点菜宝接口感兴趣,所以就把写的demo程序共享出来,大家一起讨论改进,so放百度云地址: 百度云下载地址

  2. 集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序

    在2015年8月份的时候,决心学习图像算法. 几乎把当时市面上的图像算法相关书籍都看了一遍, 资金有限,采取淘宝买二手书,长期驻留深圳图书馆的做法, 进度总是很慢,学习算法不得其法. 虽然把手上所有书 ...

  3. ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程

    安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...

  4. 32.QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序

    由于上位机需要绘制电压电阻表盘,如下图所示: 后来,在网上找阿找,还是没找到满意的,索性自己来画控件算了,由于第一次画控件,所以花了我2天时间,才画好 效果图如下: 上图的所有颜色(包括滑动的渐变/单 ...

  5. 创建第一个SpringBoot的demo程序

    在这里,我只介绍手动创建的其中一种方式. 默认,你已经安装了IntelliJ IDEA和JDK1.8,如果没有,请先安装.   第一步:选择新建一个项目 File-->New-->Proj ...

  6. coco2d-js demo程序之滚动的小球

    近期有一个游戏叫围住神经猫,报道说是使用html5技术来做的. html5的跨平台的优良特性非常不错.对于人手不足,技术不足,选用html5技术实现跨平台的梦想真是不错. 近期在看coco2d-js这 ...

  7. 微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)

    昨天1月9日微信小程序发布,顿时被朋友圈刷爆,今天看了一下官方文档,自己开始一步一步搭建环境体验小程序开发. 常见问题: 1.微信小程序开发是否需要重新创建开发者账号? 需要,即使之前申请了微信服务号 ...

  8. 使用/dev/uinput的简要介绍(含demo程序)【转】

    转自:https://blog.csdn.net/zhongkunjia/article/details/75142699 uinput机制有2个很大的优点: 1) 不用自己写驱动(比如弄个红外遥控器 ...

  9. QT Linux Demo程序编译

    我手上的qt源码包为:qt-everywhere-opensource-src-4.7.0.tar.gz 在Linux下编译比较容易,解压后直接 ./configure,一般会报缺少什么库这些.自己遇 ...

随机推荐

  1. weibform中Application、ViewState对象和分页

    Application: 全局公共变量组 存放位置:服务器 特点:所有访问用户都是访问同一个变量,但只要服务器不停机,变量一直存在于服务器的内存中,不要使用循环大量的创建Application对象,可 ...

  2. 转:工具类之SpannableStringUtils(相信你会爱上它)

    这个工具类真是构思了良久才设计出来,采用了建造者模式,然后你们就可以用链式调用了,talk is cheap, let me show the demo. demo code 有没有心动一下哈,下面就 ...

  3. OGNL的使用

    访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...

  4. asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .

    Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...

  5. 浅谈我对 jQuery 的了解

    总述 0 获取 jQuery 对象 1 对象跳转 2 方法调用 3 常用API 4 $(…); 5 jQuery 对象获取 6 Data 相关方法 7 选择器 8 基本的过滤器 9 内容过滤选择器 1 ...

  6. C#在Linux+Mono环境中使用微信支付证书

    最近特殊的需求,要把微信平台一个功能页面部署到Linux(CentOS6.5)下,其中涉及到微信支付退款. 鉴于之前实践过mono+jexus+asp.net mvc的部署,于是问题重点在于解决对商户 ...

  7. Unity3d:UI面板管理整合进ToLua

    本文基于 https://github.com/chiuan/TTUIFramework https://github.com/jarjin/LuaFramework_UGUI 进行的二次开发,Tha ...

  8. UTC时间和本地时间的区别

    在用AS3的Date时,年月日都有两个api,带UTC和不带UTC的,比如fullYear,fullYearUTC 输出看一下: var date:Date = new Date; trace(dat ...

  9. css实现一行文字居中,多行文字居左

    第一种方法: <style> *{margin:0;padding:0;} .box{width:500px;height:300px;border:1px solid #000;text ...

  10. Bug管理系统 BugFree

    BugFree - 借鉴微软公司软件研发理念.免费且开放源代码.基于Web的精简版Bug管理系统 在线演示:http://www.bugfree.org.cn/demo/Login.php 其它项目管 ...