RPC(Remote Procedure Call Protocol)远程通信框架

一、简介

官方网站:Remote Call Framework (RCF) - Delta V Software

下载版本:RCF 3.2.403  ubuntu 20

https://www.deltavsoft.com/downloads/RCF-3.2.413.tar.gz

RCF(Remote Call Framework,远程调用框架)是一个C++的框架。这个框架用来为实现C++程序进程间调用提供一个简单和一致(consistent)的方法。这个框架基于强类型的C/S接口概念,类似于用户所熟悉的CORBA,DCOM这样的中间件 。

注意:只支持C++

二、RCF优势:

· 可移植性 支持多种编译器,和操作系统.
· 可伸缩性 可用于广泛应用,从父子进程IPC到大型分布式系统.
· 高效, 在一些关键路径上使用了零拷贝,零分配,包括服务端和客户端.
· 支持多种传输方式 (TCP, UDP, Win32有名管道 and UNIX本地套接字).
· 支持压缩和加密.
· 支持单向和双向消息.
· 支持批量单向消息.
· 支持发布/订阅风格消息.
· 支持UDP上的多播和广播.
· 支持服务端到客户端的回调.
· 健壮的版本支持.
· 内建串行化框架.
· 内建 Boost.Serialization 支持.
· 内建Google's Protocol Buffers 支持.
· 支持单线程和多线程编程模式.
· 无依赖, 除了一些 Boost 头文件 (1.33.0 or later). zlib 和 OpenSSL 依赖是可选.

三、RCF使用场景

· 客户端-服务器系统,分布在局域网或者广域网. 从工业进程控制角度,替代分布式桌面应用DCOM,提供跨平台通信能力.
    后台服务组件,在典型的同质局域网环境。
· Windows服务和她的监控程序之间的通信。
· 32位和64位可执行组件通信桥,例如64位程序调用32位动态连接库.
· 父子进程间通信.
· 一般的本地IPC,取代COM.

四、linux ubuntu编译

Remote Call Framework (RCF) - Delta V Software

https://www.deltavsoft.com/doc/_building_r_c_f.html  

RCF-3.2.413/src/RCF/Uuid.cpp:46:10: fatal error: uuid/uuid.h: 没有那个文件或目录


这个是因为没安装uuid软件包导致的,ubuntu系统下可以使用命令sudo apt-get install uuid-dev安装。

五、使用

TCP Server and Client

#include <iostream>
#include <RCF/RCF.hpp>
// Define the I_PrintService RCF interface.
RCF_BEGIN(I_PrintService, "I_PrintService")
    RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)
// Server implementation of the I_PrintService RCF interface.
class PrintService
{
public:
    void Print(const std::string & s)
    {
        std::cout << "I_PrintService service: " << s << std::endl;
    }
};
int main()
{
    try
    {
        // Initialize RCF.
        RCF::RcfInit rcfInit;
        // Instantiate a RCF server.
        RCF::RcfServer server(RCF::TcpEndpoint("127.0.0.1", 50001));
        // Bind the I_PrintService interface.
        PrintService printService;
        server.bind<I_PrintService>(printService);
        // Start the server.
        server.start();
        std::cout << "Press Enter to exit..." << std::endl;
        std::cin.get();
    }
    catch ( const RCF::Exception & e )
    {
        std::cout << "Error: " << e.getErrorMessage() << std::endl;
    }
    return 0;
}

TCP Client

#include <iostream>
#include <RCF/RCF.hpp>
// Define the I_PrintService RCF interface.
RCF_BEGIN(I_PrintService, "I_PrintService")
    RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)
int main()
{
    try
    {
        // Initialize RCF.
        RCF::RcfInit rcfInit;
        std::cout << "Calling the I_PrintService Print() method." << std::endl;
        
        // Instantiate a RCF client.
        RcfClient<I_PrintService> client(RCF::TcpEndpoint("127.0.0.1", 50001));
        // Connect to the server and call the Print() method.
        client.Print("Hello World");
    }
    catch ( const RCF::Exception & e )
    {
        std::cout << "Error: " << e.getErrorMessage() << std::endl;
    }
    return 0;
}

六、支持订阅、发布的方式

Publish/subscribe - Publisher

#include <iostream>
#include <RCF/RCF.hpp>
// Define RCF interface.
RCF_BEGIN(I_PrintService, "I_PrintService")
    RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)
int main()
{
    try
    {
        RCF::RcfInit rcfInit;
        RCF::RcfServer server(RCF::TcpEndpoint("127.0.0.1", 50001));
        server.start();
        // Configure a publisher.
        typedef RCF::Publisher<I_PrintService>              PrintServicePublisher;
        typedef std::shared_ptr< PrintServicePublisher >    PrintServicePublisherPtr;
        PrintServicePublisherPtr publisherPtr = server.createPublisher<I_PrintService>();
        // Publish a message once every second.
        while ( true )
        {
            publisherPtr->publish().Print("Hello World");
            RCF::sleepMs(1000);
        }
    }
    catch ( const RCF::Exception & e )
    {
        std::cout << "Error: " << e.getErrorMessage() << std::endl;
    }
    return 0;
}

Publish/subscribe - Subscriber

#include <iostream>
#include <RCF/RCF.hpp>
// Define RCF interface.
RCF_BEGIN(I_PrintService, "I_PrintService")
    RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)
// This class will receive the published messages.
class PrintService
{
public:
    void Print(const std::string & s)
    {
        std::cout << "I_PrintService service: " << s << std::endl;
    }
};
int main()
{
    try
    {
        RCF::RcfInit rcfInit;
        
        PrintService printService;
        RCF::RcfServer server(RCF::TcpEndpoint(-1));
        server.start();
        // Configure a subscription.
        RCF::SubscriptionParms subParms;
        subParms.setPublisherEndpoint(RCF::TcpEndpoint("127.0.0.1", 50001));
        RCF::SubscriptionPtr subscriptionPtr = server.createSubscription<I_PrintService>(
            printService,
            subParms);
        // At this point, should be receiving published messages from the publisher.
        // ...
        std::cout << "Press Enter to exit..." << std::endl;
        std::cin.get();
    }
    catch ( const RCF::Exception & e )
    {
        std::cout << "Error: " << e.getErrorMessage() << std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值