C ++调用远程对象的方法(类似RPC)

时间:2012-04-30 20:32:33

标签: c++ windows ipc pipe rpc

我正在搜索一个RPC库,它允许我在另一个进程中调用对象的成员函数(在Windows上)。

我目前遇到的问题是某些Serverside对象已经存在并且有多个实例。服务器应该能够将指针/标识符传递给实现代理的客户端,然后该代理将调用定向到远程对象实例。所以我基本上想要的是这样的:

Client:
TestProxy test = RemoteTestManager.GetTestById(123);
test.echo("bla");

其中测试实例已存在于服务器上,而RemoteTestManager是客户端在另一个rpc调用中获取的服务器上的管理器类。它也应该优先运行命名管道,因为在同一台机器上可以有多个服务器(实际上我想要更像一个简单的IPC:D)。

所以我的问题实际上是:C ++有没有这样的东西,或者我自己编写代码

5 个答案:

答案 0 :(得分:2)

对于跨网络的低级串行化消息,协议缓冲区是一种常见的选择......

http://code.google.com/p/protobuf/

有关更完整的RPC堆栈,请查看Apache Thrift ...

http://thrift.apache.org/

答案 1 :(得分:1)

COM怎么样?似乎完全符合您的要求。

答案 2 :(得分:1)

您可能已经找到了解决方案。仅供其他人参考,我创建了一个与您在此处提出的匹配的库。看看CppRemote图书馆。此库具有以下与您的描述相符的功能:

  • 按名称(std :: string)获取指向服务器对象的指针。
  • 在服务器上绑定现有对象(非侵入式),然后从客户端获取该对象的代理。
  • 服务器可以绑定到现有对象的多个实例。
  • 它命名为管道运输。
  • 轻巧且易于使用。

服务器代码

Test test1, test2;
remote::server svr;
svr.bind<itest>(&test1, "test1");
svr.bind<itest>(&test2, "test2");
svr.start(remote::make_basic_binding<text_serializer, named_pipe_transport>("pid"));
...

客户端代码

remote::session client;
client.start(remote::make_basic_binding<text_serializer, named_pipe_transport>("pid"));

auto test1 = client.get<itest>("test1");
auto test2 = client.get<itest>("test2");
test1->echo("bla");
test2->echo("bla");

答案 3 :(得分:0)

ZeroMQ可能是目前最好的IPC系统,允许客户端/服务器拓扑结构的各种组合。而且它也非常快速有效。

如何访问服务器对象取决于它们的实现方式,CORBA具有此功能,但我现在不会尝试使用CORBA(或者TBH)。许多RPC系统允许您根据需要创建对象,或连接到单个实例。连接到为您创建的对象,并在该会话期间为每个调用保留(即为每个客户端创建并保持活动的对象)仍然相当普遍。对象池也是相当普遍的。但是,你必须管理这些服务器对象的生命周期,我不能真正建议,因为你没有说明你的管理方式。

我怀疑你想要命名管道,坚持使用tcp / ip连接 - 连接到localhost是一个非常轻量级的操作(在这种配置中COM实际上是零开销)。

答案 4 :(得分:0)

名单上有候选人。但这取决于问题空间。肯顿·瓦尔达(Kenton Varda)的Capnproto快速浏览,也许很合适。 CORBA有点陈旧,但已在许多系统和框架(例如ACE)中使用。问题之一是功能引用的PassByCopy,在capnproto中还提供了PassByReference和PassByConstruction。 COM系统也存在一些问题,需要自己讨论。 ZeroMQ真的很酷,我感冒一次。而且它不支持RPC,这意味着您必须在零级消息传递中实现它。如果您不寻找功能安全性,承诺管道和capnproto提供的其他不错的功能,也可以选择Google protobuf,kenton varda。我认为您最好尝试一下。

提醒一下,RPC不仅与远程对象调用有关。关注的领域,例如足够的抽象和组合级别,流水线,消息传递,lambda演算,功能安全性……是必须密切关注的重要领域。因此,更好的解决方案是为您的问题空间找到高效而优雅的解决方案。

希望能全力以赴。

最佳, 奥米德(Omid)