`
febird
  • 浏览: 246503 次
  • 性别: 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

 

分享到:
评论

相关推荐

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

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

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

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

    IDL语言实现图像旋转程序

    使用IDL语言实现的图像旋转程序,别的语言也可以借鉴思路

    IDL实现非监督分类源码

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

    idl入门教程(适合idl初学者)

    多数人不能利用工作中的时间学习IDL,笔者想写一本能满足这两类人学习IDL的书。总之,本书为不喜欢读教科书并能通过例子学得最好的人全面介绍IDL的精髓。本书在IDL编程技术和技巧方面只做了简要概略,而这些技术只能...

    遥感:IDL语言实现间接法图像旋转

    遥感:IDL语言实现间接法图像旋转,适合初学者,无斑点噪声

    RPC的实现

    介绍RCP的实现原理 目录 1. 前言 2 2. 基本概念 3 2.1. IDL 3 2.2. 代理(Proxy) 3 2.3. 存根(Stub) 4 3. 三要素 4 3.1. 网络通讯 4 3.2. 消息编解码 5 3.3. IDL编译器 5 4. flex和bison 5 4.1. 准备概念 5 ...

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

    基于IDL和Visual_C++的混合编程,望对大家有一定的用途!

    IDL精髓.pdf

    IDL精髓.pdf COM idl C++

    IDL介绍及PCA变换算法的实现_IDL;pca_

    IDL实现的主成分分析变换,可以计算相关性矩阵,特征值和特征向量

    IDL实现坐标变换的程序代码

    IDL实现坐标变换的小程序,对平面坐标系进行各种设置与改变,包括改变窗口颜色、一个窗口显示多个坐标系、坐标轴的标题设置、设置坐标轴范围及刻度数、添加注释线、改变注释字号等。

    VC++调用IDL的使用案例

    VC++调用IDL的使用案例 有多个IDL和VC相互调用的案例 打包在一个文件夹中

    该工程是Tars RPC框架C++语言的源代码

    该工程是Tars RPC框架C++语言的源代码 , C++语言框架rpc的源码实现,C++语言框架IDL工具的源码实现 。

    IDL.rar_IDl_doc_idl入门教程

    对学习IDL有很大的帮助,IDL入门教程一.doc,IDL入门教程二(上)(简单图形显示II).doc,IDL入门教程二(下)(简单图形显示I).doc,IDL入门教程三(上).doc,IDL入门教程三(下).doc,IDL入门教程四(图形显示技术).doc,IDL入门...

    基于C++CORBA高级编程

    图书介绍: CORBA规范是目前最具生命力的跨平台技术,它独立于网络...本书是一本使用C++编写CORBA应用程序的实用指南,适用于大学教师和研究生作为教材或参考书,也可作为从事CORBA技术开发的软件工程师的参考书。

    Java调用IDL程序(IDL Bridge桥接方法)

    Java调用IDL程序需要通过 IDL bridge来完成这一目的,该文件包括对IDL程序编写的规范格式示范,以及提供了本人编写的参考例子,提到在实现调用IDL过程中出现的一些错误以及解决方法。该资源中的word文件较为详细的...

    IDL影像旋转程序

    IDL影像旋转程序

    IDL精髓美 Martin Gudgin

    本书向读者提供了IDL的详细描述及如何使用IDL方面的知识,基于示例、由浅入深地阐述了各种IDL构造,并提供了示例C++和VB代码。 本书分为两大部分,共10章。第一部分包括前6章,这部分完整地描述了IDL中的各种构造。...

    IDL实现快速大气校正

    IDL实现快速大气校正;envi5.3 包括pro文件代码和备份的防止pro格式乱码的txt文件 主要调用ENVITask('QUAC')实现大气校正

    遥感、大气校正、IDL语言实现(初学者)

    适合初学者,很好理解

Global site tag (gtag.js) - Google Analytics