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

问题描述 投票:0回答:6

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

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

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

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

所以我的问题实际上是:是否有类似的 C++ 代码或者我必须自己编写一个代码

c++ windows ipc pipe rpc
6个回答
2
投票

就跨网络消息的低级序列化而言,Protocol Buffers 是一种常见的选择......

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

要了解更完整的 RPC 堆栈,请查看 Apache Thrift...

http://thrift.apache.org/


1
投票

COM 怎么样?看起来完全符合您的要求。


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");

0
投票

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

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

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


0
投票

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

提醒一下,RPC 不仅仅是远程对象调用。诸如足够水平的抽象和组合、管道、消息传递、lambda 演算、能力安全等值得关注的领域是必须密切关注的重要领域。因此,更好的解决方案是为您的问题空间找到高效且优雅的解决方案。

希望对您有帮助。

最好的, 奥米德


0
投票

AREG框架基于Object RPC,精确触发远程对象的方法: https://github.com/aregtech/areg-sdk

© www.soinside.com 2019 - 2024. All rights reserved.