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等提供接口
---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;
}