Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;RPC库建议 我正在寻找C++中实现的RPC库的建议,C++开发人员。_C++_Rmi_Rpc - Fatal编程技术网

C++;RPC库建议 我正在寻找C++中实现的RPC库的建议,C++开发人员。

C++;RPC库建议 我正在寻找C++中实现的RPC库的建议,C++开发人员。,c++,rmi,rpc,C++,Rmi,Rpc,一些需求约束: 应能在linux/unix和win32系统上工作 能够执行自由函数和类方法 < LI>希望用现代C++编写而不是90版/java ESC++ C++ 能够在网络和异构体系结构上运行 不太慢或效率不高 希望为TR1样式的std::function等提供接口 我的示例用法是在远程机器上调用自由函数foo ---snip--- // foo translation unit int foo(int i, int j) { return i + j; } ---snip---

一些需求约束:

  • 应能在linux/unix和win32系统上工作
  • 能够执行自由函数和类方法
  • < LI>希望用现代C++编写而不是90版/java ESC++ C++
  • 能够在网络和异构体系结构上运行
  • 不太慢或效率不高
  • 希望为TR1样式的std::function等提供接口
我的示例用法是在远程机器上调用自由函数foo

---snip---
// foo translation unit
int foo(int i, int j)
{
   return i + j;
}
---snip---


---snip---
// client side main
int main()
{
   //register foo on client and server
   //setup necassary connections and states

   int result;

   if (RPCmechanism.invoke("foo",4,9,result))
      std::cout << "foo(4,9) = " result << std::endl;
   else
      std::cout << "failed to invoke foo(4,9)!" << std::endl;

   return 0;
}
---snip---
——剪断---
//富翻译组
int foo(int i,int j)
{
返回i+j;
}
---剪断---
---剪断---
//客户端主
int main()
{
//在客户端和服务器上注册foo
//设置必要的连接和状态
int结果;
if(RPCmechanism.invoke(“foo”,4,9,result))

std::cout查看FastRPC,。

您可以使用protobuf自己实现一个,并添加所有您想要的功能。这并不难,您可以从中获得很多好处。

您是否尝试过节俭,

像DCE-RPC、CORBA之类的旧功能

或者,或者,

或者像SOAP或REST这样的网络

您想要哪个取决于您想要做什么。例如,本地网络的快速高效RPC需要一个轻量级的、类似二进制RPC的协议缓冲区,但异构web服务的RPC需要更详细的SOAP


谷歌所有的内部RPC都使用PB,所以这是一个不错的选择。Facebook使用Thrift,所以它不是一个小玩家,微软喜欢SOAP。

这是一系列的要求

虽然没有见到所有的人(因为我不确定是否有这样的野兽存在——我向你们推荐ZeroC。部分由CORBA fame的Michi Henning开发(问问你们在电信界的朋友,这真的不是一个肮脏的词),但如果CORBA不是由一个委员会开发的,那么ICE就是CORBA的样子

< C++映射是CORBA不是的一切,它使用STL类型,通常是更新的感觉。

它没有通过免费函数和std::函数测试,但是考虑到不可能为整个列表找到一个产品,这就很好地解决了剩余的许多问题


<好运>

< P>我也对可行的C++ RPC实现感兴趣。经过研究,我发现蚀刻、节省和协议缓冲是最有希望的解决方案,但是它们都没有满足我的所有需要。我的搜索标准是:

  • 多语言,C++和PHP是必须的(C语言,java,python,perl现在不是很重要)
  • 服务器只能在Linux上编译/运行(Windows是长期目标)
  • 客户端必须在Windows和Linux(可能还有Mac)上运行
  • 开源和商业友好(即没有GPL)
  • 它必须支持开箱即用的加密
  • 候选人包括:

  • 阿帕奇蚀刻

    优点:

    • C绑定基于APR
    • 支持加密
    • 在两个平台上运行
    缺点

    • 缓慢发展
    • 缺少PHP绑定
  • 阿帕奇节俭

    优点:

    • 小的
    • 多语言绑定
    缺点:

      目前,它不支持加密(正在开发中,至少对于C++绑定)
    • 在Windows上,它需要Cygwin
  • 使用内部开发的RPC解决方案的协议缓冲区

    优点:

    • 小的
    • 多语言绑定
    缺点:

    • 没有内置的RPC
  • 目前,我正在评估使用APR为Protobuf开发RPC层的可能性

    然而,搜索仍在继续


    编辑:我通过使用ApacheQPID(C++版本)解决了其中一些问题使用protobuf进行序列化,尽管它目前缺少一些我需要的功能。

    下面的代码来自示例TAO CORBA客户端,显示连接到服务器需要3行代码,调用函数需要一行代码。请注意,函数调用看起来像本机本地函数调用。这可以是自由函数或成员函数

    // Bring in the IOR
    Object_var factory_object =  orb->string_to_object (argv[1]);
    
    // Now downcast the object reference 
    My_Factory_var factory = My_Factory::_narrow (factory_object.in ());
    
    // Now get the full name and price of the other arguments:
    Widget_var widget = factory->get_widget (argv[i]);
    
    // Get its name, put it on a _var so it is automatically
    // released!
    String_var full_name = widget->full_name ();
    
    // Now get the price
    Double price = widget->price ();
    
    cout << "The price of a widget in \""
      << full_name.in () << "\" is $"
      << price << endl;
    

    看看

    RCF看起来是你想要的:

    它应该可以在linux/unix和win32上工作,thrift在win32上工作吗?检查一下,即使win32编程可以使用MinGW和cygwin完成,但传统上win32编程是使用msvc完成的,我看不到任何msvc win32的内容。Protobuffers是消息序列化,SOAP是COM等同和REST是Web2.0的一个与C++无关的、Tr1的STD::函数等等。TrimBuf支持RPC服务:它提供了一个在这个问题中被提出的机制,或者它需要进一步的工作来获得这种功能吗?这个问题需要一个库,我对推出自己的库不感兴趣。RPC类的功能。虽然它可能是一个额外的工作,使它以某种方式运行。我看了一下,C++ API似乎没有建议自由或类方法可以调用它,更像是一个类似于库的原型缓冲区。例如,我有一个函数fO,例如int fo(int i,int j){返回i+j}。一个如何用服务器实体登记FO,然后如何从客户端调用PoAM 4和9的FO?CORBA IDL的可能副本到C++映射不使用STL,但是IDL到C++ 11语言映射现在完全使用STL,并且使用C++的所有新特性是GPL。奥斯。
    // First initialize the ORB, that will remove some arguments...
    ORB_var orb = ORB_init(argc, argv, "ORB" /* the ORB name, it can be anything! */);
    Object_var poa_object = orb->resolve_initial_references("RootPOA");
    PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_object.in());
    PortableServer::POAManager_var poa_manager = poa->the_POAManager();
    poa_manager->activate();
    
    // Create the servant
    My_Factory_i my_factory_i;
    
    // Activate it to obtain the object reference
    My_Factory_var my_factory = my_factory_i._this();
    
    // Put the object reference as an IOR string
    String_var ior = orb->object_to_string (my_factory.in());
    orb->run();
    
        // Now in your stub file generated by the idl compiler, 
        char * Widget_i::full_name (
    
      )
      ACE_THROW_SPEC ((
        ::CORBA::SystemException
      ))
    {
      return "Some widget name";
    }
    
    ::CORBA::Double Widget_i::price (
    
      )
      ACE_THROW_SPEC ((
        ::CORBA::SystemException
      ))
    {
      return 1.25;
    }