在上一篇文章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. 通过FileHandle获取FileObject对象

    <div id="wrap"> <!-- google_ad_section_start --> NTSTATUS MyNtReadFile(<br& ...

  2. 优化Web中的性能

    优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...

  3. 如何关闭eslint

    在vue-cli搭建webpack中,使用eslint进行代码规范化检查. 进行关闭,在根目录下有个.eslintignore直接将不想要检查的文件丢进去就可以了 也可以在重构的时候把它关闭掉

  4. Codeforces Round #388 (Div. 2) - C

    题目链接:http://codeforces.com/contest/749/problem/C 题意:给定一个长度为n的D/R序列,代表每个人的派别,然后进行发表意见,顺序是从1到n.每个人到他的回 ...

  5. haxe jni调用输入法

    public static void startInputDialog(final String title, final String text, final String buttonLabel, ...

  6. 查看java源码显示source not found

    除了下载的jar包之外,还要下载src源码的zip包. 进项目的Java Build Path里找到你想看源码的jar包 Source Attachment Configuration--Extern ...

  7. 关于在header里增加参数的方式

    在使用一个API的时候,文档里写的返回值类型是json,可是试了下返回的明明是xml,还小小的鄙视了一把. 可是解析xml,好麻烦的.最好是json可以直接decode . 意外看到文档下面有一句 J ...

  8. 利用PHP的ob函数实现生成静态化页面

    之前用过一些开源的CMS管理系统,当时就很好奇后台中的生成HTML静态文件是怎么实现的.今天和同事讨论了下,没想到同事之前做过这类的生成静态页面的功能,果断向他请教了下. 经他讲解后,才知道其实生成静 ...

  9. js基础

    JavaScript组成: ◆ECMASCript    语法标准◆DOM         JS操作网页(api) ◆BOM   操作浏览器的api JavaScript特点: ◆简单易用    == ...

  10. STM32之看门狗(独立与窗口)

    广大的互联网网友们,大家早上中午晚上好,我是某某某..对于狗..看过<忠犬八公>的我.无不深深的被狗的义气与灵气所震撼..我也觉得在所有mcu中用看门狗来形容让系统复位的功能是很恰当的.也 ...