C ++调用远程对象的方法(RPC一样)

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

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

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

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

所以我的问题实际上是:是否有像这样的C ++在那里,或者我必须自己编写一个

Solutions Collecting From Web of "C ++调用远程对象的方法(RPC一样)"

在低层序列化网络中的消息协议缓冲区是一个常见的选择…

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

对于更完整的RPC堆栈,请参阅Apache Thrift …

http://thrift.apache.org/

COM如何? 似乎完全符合您的要求。

您可能已经找到了解决方案。 只是为了其他的参考,我创建了一个符合你在这里问的图书馆。 看看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"); 

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

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

我怀疑你想要命名管道,坚持TCP / IP连接 – 连接到本地是一个非常轻量级的操作(在这种配置COM实际上是零开销)。