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

C++ C++;调用远程对象的方法(类似RPC),c++,windows,ipc,pipe,rpc,C++,Windows,Ipc,Pipe,Rpc,我正在搜索一个RPC库,它允许我在另一个进程(在Windows上)中调用对象的memberfunction 我目前遇到的问题是,一些服务器端对象已经存在,并且有多个实例。服务器应该能够将指针/标识符传递给客户机,客户机实现一个代理,然后将调用定向到远程对象实例。所以我基本上想要的是这样的: Client: TestProxy test = RemoteTestManager.GetTestById(123); test.echo("bla"); 其中,服务器上已经存在测试实例,并且Remote

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

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

Client:
TestProxy test = RemoteTestManager.GetTestById(123);
test.echo("bla");
其中,服务器上已经存在测试实例,并且RemoteTestManager是客户端在另一个rpc调用中获得的服务器上的管理器类。另外,它最好在命名管道上运行,因为在同一台机器上可以有多个服务器(实际上,我希望更像一个简单的IPC:D)

我的问题实际上是:在C++上有这样的事情,或者我必须自己编写一个< /p> ,也许是目前最好的IPC系统,它允许客户机/服务器拓扑结构的不同组合。而且它真的很快也很有效

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


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

就通过网络协议缓冲区对消息进行低级序列化而言,这是一个常见的选择

要获得更完整的RPC堆栈,请查看Apache Thrift


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

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

  • 按名称(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"));
...
测试test1、test2;
远程::服务器svr;
svr.bind(&test1,“test1”);
svr.bind(&test2,“test2”);
svr.start(远程::生成基本绑定(“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");
remote::会话客户端;
启动(远程::生成基本绑定(“pid”);
autotest1=client.get(“test1”);
autotest2=client.get(“test2”);
test1->echo(“bla”);
测试2->echo(“bla”);

名单上有候选人。但这取决于问题空间。快看一眼,卡普普罗托,肯顿·瓦尔达的,也许是一次发作。CORBA有点老,但在许多系统和框架中都有使用,比如ACE。其中一个问题是capnproto PassByReference和PassByConstruction中还提供了功能引用的PassByCopy。COM系统也存在一些问题,需要自己探讨。ZeroMQ真的很酷,我曾经感冒过。而且它不支持RPC,这意味着您必须在零级消息传递上实现它。另外,如果您不想寻找诸如功能安全、promise管道和capnproto提供的其他优秀功能,那么Google protobuf、kenton varda可能是一个选择。我想你最好自己试试看

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

希望能得到帮助

最好的,
Omid

tcp/ip连接的问题是,我的服务器需要监听一个端口,每个端口只能监听一个服务器。对于命名管道,我可以只使用服务器的pid作为标识符。如果要使用套接字,我需要某种方法来获取服务器要侦听的套接字。实际上,这些对象并不是由服务器本身管理的,而是由另一个应用程序管理的,该应用程序导入服务器以授予对其他程序的rpc访问权,因此我不能像RFC在这里那样使用垃圾收集。是的,但我不想为所有内容编写包装器类。由于我无法更改要导出的对象的定义,因此我无法使用COM