RCF进程间通信Demo程序

在上一篇文章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

时间: 2024-11-25 13:00:47

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

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

最近有一个游戏叫围住神经猫,报道说是使用html5技术来做的. html5的跨平台的优良特性很不错,对于人手不足,技术不足,选用html5技术实现跨平台的梦想真是不错. 最近在看coco2d-js这个跨平台游戏开发框架,很不错,写了一个demo程序供大家参考. /** * Created by caicai on 14-7-27. */ var Ball = cc.Sprite.extend({ velocity:null, ctor:function () { this._super(res.

Cocostudio 1.4 实现的Demo程序源代码

开发环境是CocoStudio 1.4 + Cocos2dx 2.2.3 把项目文件放到Cocos2dx下的projects目录下即可运行了 压缩包里面包含了 源代码 和资源文件 1.DemoShop 运行效果 下载地址: 点击打开链接 2.DemoMap 运行效果 下载地址: 点击打开链接 3.ImageViewer 运行效果 下载地址: 点击打开链接 Cocostudio 1.4 实现的Demo程序源代码

ERPSYSTEM开发教程03 DEMO程序开发过程

DEMO程序说明 提供了两个演示接口 IBplOne=interface ['{E4C1C5FA-C598-4834-9111-26B52634068D}'] function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; end; IDllOne=interface ['{0434DE04-07C9-4623-9009-CF7892768431}'] function GetString:string; procedu

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

昨天1月9日微信小程序发布,顿时被朋友圈刷爆,今天看了一下官方文档,自己开始一步一步搭建环境体验小程序开发. 常见问题: 1.微信小程序开发是否需要重新创建开发者账号? 需要,即使之前申请了微信服务号,并认证过,也需要重新申请小程序. 在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的“立即注册”按钮.选择“小程序”,按提示步骤注册即可. 2.个人能否申请小程序? 不能,目前只支持企业.个体工商户.政府.媒体.其他组织. 3.没有资格申请小程序,能否开始小程序开发? 可以,下

WebSocket基于javaweb+tomcat的简易demo程序

由于项目需要,前端向后台发起请求后,后台需要分成多个步骤进行相关操作,而且不能确定各步骤完成所需要的时间 倘若使用ajax重复访问后台以获取实时数据,显然不合适,无论是对客户端,还是服务端的资源很是浪费 这种情况下,WebSocket能够解决此问题 它不像普通的http请求或者ajax访问,返回相应的结果就关闭了连接 WebSocket在个人浅薄的知识看来是属于长连接,能保持连接,随时收发数据 所以对WebSocket进行了初步了解,并按照相关的教程尝试做了一个简易demo 首先需要了解的是,W

UFT demo程序(一)

此程序使用dp方式,调用外部函数,最终结果入Excel 1 Option explicit 2 systemutil.Run "C:\Program Files (x86)\HP\Unified Functional Testing\samples\flight\app\flight4b" 3 ExecuteFile "C:\Auto-Flight\object.vbs" 4 ExecuteFile "C:\Auto-Flight\function.vbs

Lucene入门-安装和运行Demo程序

Lucene是什么 Lucene是一款高性能.可扩展的信息检索工具库.- Lucene In Action Lucene版本:7.1 一.下载安装包 https://lucene.apache.org/core/downloads.html 二.安装 把4个必备jar包和路径添加到CLASSPATH \lucene-7.1.0\core\lucene-core-7.1.0.jar \lucene-7.1.0\queryparser\lucene-queryparser-7.1.0.jar \lu

JavaScript下全选反选的Demo程序里实现checkmeonly函数 DOM

<!doctype html>   <html lang="en">   <head>   <meta charset="UTF-8">   <meta name="Generator" content="EditPlus®">   <meta name="Author" content="">   <meta

PHP MAIL DEMO(程序代码直接发送邮件)

php代码 <?php // 收件人邮箱地址 $to = '[email protected]'; // 邮件主题 $title = '测试邮件发送'; // 邮件内容 $msg = '这是一封测试邮件'; // 发件人邮箱(虚拟的,本身发送的时候并不是用这个邮箱) $from = 'From: [email protected]'; $flag = mail($to, $title, $msg, $from); // 打印结果,如果不加var_dump会有空值转换,即null转成‘’ echo