`
febird
  • 浏览: 256308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用C++的高级模版特性实现一个不需要IDL的RPC

阅读更多

项目地址:http://code.google.com/p/febird

 

目前已经全部完成,并且取得了非常好的效果 。

使用该RPC的简短代码:

//////////////////////////////////////////////////////////////////////////

// sample usage...

// test.h

namespace febird { namespace rpc {

//////////////////////////////////////////////////////////////////////////

// sample usage...

// test.h

 

class SampleRPC_Interface1 : public remote_object

{

public:

    typedef std::vector<var_uint32_t> vint_vec;

 

    BEGIN_RPC_REGISTER_MF(SampleRPC_Interface1)

        RPC_REGISTER_MF(get_val)

        RPC_REGISTER_MF(get_len)

        RPC_REGISTER_MF(squareVec)

        RPC_REGISTER_MF(multiVec)

    END_RPC_REGISTER_MF()

   

RPC_DECLARE_MF(get_val, (rpc_in<int> x))

 

    RPC_DECLARE_MF(get_len, (const std::string& x))

    RPC_DECLARE_MF(squareVec, (vint_vec& x))

    RPC_DECLARE_MF(multiVec, (vint_vec& z, vint_vec& x, vint_vec& y))

 

 

#ifdef RPC_CLIENT_SIDE

    void printVec(const vint_vec& vec);

#endif

};

 

class SampleRPC_Interface2 : public remote_object

{

public:

    BEGIN_RPC_REGISTER_MF(SampleRPC_Interface2)

        RPC_REGISTER_MF(get_val)

        RPC_REGISTER_MF(get_len)

    END_RPC_REGISTER_MF()

   

RPC_DECLARE_MF(get_val, (rpc_in<int> x))

 

    RPC_DECLARE_MF(get_len, (const std::string& x))

};

 

} } // namespace febird::rpc

 

 

// server.cpp

 

// test_rpc_server.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <tlib/rpc/server.h>

#include <tlib/io/SocketStream.h>

#include <iostream>

#include "../test.h"

 

namespace febird { namespace rpc {

 

rpc_return_t SampleRPC_Interface1::get_val(rpc_in<int> x)

{

    std::cout << "SampleRPC_Interface1::get_val(rpc_in<int> x=" << x.get() << ")\n";

    return x.get();

}

rpc_return_t SampleRPC_Interface1::get_len(const std::string& x)

{

    std::cout << "SampleRPC_Interface1::get_len(const std::string& x=\"" << x << "\")\n";

    return x.size();

}

rpc_return_t SampleRPC_Interface1::squareVec(vint_vec& x)

{

    for (vint_vec::iterator i = x.begin(); i != x.end(); ++i)

    {

        (*i).t *= (*i).t;

    }

    return x.size();

}

rpc_return_t SampleRPC_Interface1::multiVec(vint_vec& z, vint_vec& x, vint_vec& y)

{

    z.clear();

    for (int i = 0; i < x.size(); ++i)

    {

        z.push_back(var_uint32_t(x[i].t * y[i].t));

    }

    return 123456;

}

 

rpc_return_t SampleRPC_Interface2::get_val(rpc_in<int> x)

{

    std::cout << BOOST_CURRENT_FUNCTION << "x=" << x.get() << "\n";

    return x.get();

}

rpc_return_t SampleRPC_Interface2::get_len(const std::string& x)

{

    std::cout << BOOST_CURRENT_FUNCTION << "x=" << x << "\n";

    return x.size();

}

 

} } // namespace febird::rpc

 

    using namespace febird;

    using namespace febird::rpc;

    typedef SocketStream stream_t;

    typedef PortableDataInput <BufferedInputStream>   input_t;

    typedef PortableDataOutput<BufferedOutputStream> output_t;

 

int main(int argc, char** argv[])

{

 

#ifdef _WIN32

    WSADATA information;

    WSAStartup(MAKEWORD(2, 2), &information);

#endif

 

    rpc_server<input_t, output_t, SocketConnection> server;

    server.listen("0.0.0.0:8001");

 

    // register rpc implementation class...

 

项目地址:http://code.google.com/p/febird

 

分享到:
评论

相关推荐

    servant C++语言框架rpc的源码实现 tools C++语言框架IDL工具的源码实现 util C++语言.7z

    tools C++语言框架IDL工具的源码实现 util C++语言框架基础工具库的源码实现 examples C++语言框架的示例代码,包括:快速入门示例、promise编程入门示例、压测程序示例 unittest tars cpp rpc框架的单元测试用例,...

    RPC.rar_IDL r_RPC idl_RPC阶乘_rpc/rpc.h

    一个RPC例子,远程调用一个计算阶乘的函数。具体编写过程如下: 1、创建一个.idl文件, 为应用程序的远地函数定义一个接口。(RpcFact.idl文件) 2、应用程序属性配置文件 (RpcFact.acf文件) 3、用MIDL编译器编译...

    Windows C++ 使用WINAPI实现RPC通讯

    本文将深入探讨如何使用C++和Windows API(WINAPI)实现RPC通讯。 首先,理解RPC的基本原理至关重要。RPC是一种协议,它使得一个程序可以在不知道远程调用细节的情况下,像调用本地函数一样调用远程计算机上的函数...

    VC++调用IDL的使用案例

    首先,我们需要创建一个`.idl`文件,如`MyInterface.idl`。在这个文件中,我们将定义我们的接口,包括方法和属性。例如: ```idl [ object, uuid(5A4D3872-6E92-4c8a-A7E6-3F82A1B2A1D0), dual, nonextensible,...

    基于IDL和Visual_C++的混合编程

    虽然本文未给出具体的示例代码,但下面提供一个简单的概念性的示例来说明如何在Visual C++中调用IDL编译的DLL文件: ```cpp // 假设有一个名为MyIDLFunc的IDL函数,已经被编译成DLL // 在Visual C++中调用这个DLL的...

    IDL语言实现图像旋转程序

    7. **IDL环境与ENVI**:ENVI(Environment for Visualizing Images)是一个基于IDL的高级图像处理和分析软件。虽然这里的描述没有直接涉及ENVI,但在实际工作中,结合ENVI的高级功能可能会使图像旋转更加高效和精确...

    RPC.rar_C++ 远程调用_VC6.0 开发RPC_windows RPC_远程过程调用

    RPC,即Remote Procedure Call(远程过程调用),是计算机网络编程中的一个重要概念,它允许一个程序在不理解底层网络协议的情况下,调用另一个网络上不同机器上的程序。在这个"RPC.rar"压缩包中,主要围绕C++语言在...

    RPC的实现

    例如,如果IDL文件中定义了一个名为`Person`的消息,IDL编译器会生成相应的代码,如C++中的类或Java中的接口。 #### 4. flex和bison flex和bison是两个广泛使用的工具,分别用于词法分析和语法分析。 ##### 4.1. ...

    IDL接口定义语言的C++11语言映射规范(v1.0)

    C++ 11映射试图避免限制ORB开发人员的实现自由。对于每个OMG IDL构造,C++ 11映射解释使用C++ 11的构造的语法和语义。如果客户机或服务器程序使用C++ 11映射子句中所描述的结构,则符合此映射(是C++ 11)。

    手写rpc rpc简单源码 rpc源码学习 rpc过程了解 rpc通信原理

    1. **客户端(Client)**:发起RPC调用的一方,它通常需要知道服务接口和方法,但不需要关心服务是如何实现的。 2. **服务端(Server)**:提供服务的一方,它实现了客户端需要调用的接口和方法。 3. **服务注册与...

    Calling C from IDL(2002)

    《Calling C from IDL》是2002年发布...总之,《Calling C from IDL》文档为希望结合使用这两种语言的开发者提供了详细的指导,涵盖了从基本概念到高级技术的方方面面,帮助他们实现更高效、更灵活的数据处理解决方案。

    oncrpc.rar_RPC. VC++_oncrpc windows_windows RPC_ycnian的博客

    这个压缩包中的"oncrpc"可能是一个实现了RPC功能的库或者项目,可能包含以下内容: - `oncrpc.h`: 定义了RPC相关的数据结构和函数原型,供开发人员在代码中引用。 - `oncrpc.c/cpp`: 实现了RPC的客户端和服务端代码...

    IDL编程实现图像处理.rar_IDL界面程序_IDl_grayset_编程实现

    总的来说,这个压缩包提供了一个学习和实践如何用IDL创建图像处理界面的实例,特别是涉及到灰度值和RGB颜色空间的调整。对于初学者,这是一次了解IDL GUI编程和图像处理的好机会;对于有经验的开发者,这是一个加深...

    Thrift RPC客户端的服务化框架代码

    Thrift RPC客户端的服务化框架代码主要涉及了两个关键概念:Thrift和RPC(Remote Procedure Call,...在实际应用中,可能还需要考虑线程安全、错误处理、负载均衡、服务注册与发现等高级特性,以构建健壮的分布式系统。

    IDL实现非监督分类源码

    IDL调用ENVI库函数实现非监督分类的代码

    基于C++的CORBA实现

    在C++中实现CORBA,可以利用其强大的面向对象特性,实现高效且灵活的分布式应用。 **1. CORBA的核心概念** - **ORB (Object Request Broker)**:对象请求代理是CORBA的核心组件,它负责对象的定位、调用以及消息...

    omniorb idl 文件编译示例

    在IT行业中,CORBA(Common Object Request Broker Architecture,公共对象请求代理架构...通过这个示例,你应该对如何使用omniORB4.0.5处理IDL文件有了基本的理解,从而能够进一步探索CORBA的更多高级特性和应用场景。

    用C++实现Corba

    《用C++实现Corba》是一本针对初学者和进阶者全面介绍如何使用C++语言来实现CORBA(Common Object Request Broker Architecture,公共对象请求代理架构)的优秀教程。这本书详细阐述了CORBA的核心概念、设计原则以及...

    【Thrift之C++远程调用helloworld菜鸟教程】

    在服务器端,我们需要创建一个`TProcessor`实例(这里是`helloworld::HelloWorldProcessor`),然后绑定到一个`TSocket`或更高级的传输层,如`TFramedTransport`。接着,我们可以启动一个`TServer`(如`...

Global site tag (gtag.js) - Google Analytics