跨平台通用C ++ RPC库

时间:2010-06-17 12:27:23

标签: c++ plugins cross-platform rpc

这是任务: 想象一下,我们有一个应用程序和一个插件(动态库)。 完全定义了应用程序和插件之间的接口。 现在我需要在不同的计算机上运行应用程序和插件。我在运行真实应用程序的计算机上为插件编写了一个存根。应用程序加载它并调用它的函数,就像它是一个本机插件一样。在另一台计算机上有一个存根而不是真正的应用程序,它加载了本机插件。 现在我需要通过网络在我的存根之间组织RPC,无论传输是什么。 通常,这并不困难。但是有一些限制:

  1. 应用程序插件交互可以重新输入(例如,应用程序调用f1()来自插件,在f1()插件中调用g1()来自应用程序,在g1()应用程序中调用f2()来自插件等等......)
  2. 任何此类重新检测都应该由同一个线程执行,该线程启动序列
  3. 在哪里可以找到具有此类功能的跨平台C ++ RPC库?

1 个答案:

答案 0 :(得分:1)

限制#1是完全合理的,只要两台机器上的所有函数都没有像在RPC上锁定互斥锁那样做。

我不完全确定#2是可能的 - 让我们假设你的电话是阻塞的;当g1()调用f2()时,RPC机制不能在与f1()相同的线程上执行f2(),因为f1()被间接等待其结果阻塞!

如果您的调用是异步的,则可以在等待f1()完成时轮询RPC系统,并让它在同一个线程中执行f2()。但是你不应该这样做;这意味着当调用的RPC被推送到callstack时,任何等待RPC完成的异步调用都会突然“阻塞”。

您是否有特定原因需要此行为?

无论如何,谷歌搜索“跨平台rpc”会产生不少结果;如果你忽略第二个限制,我想其中任何一个都适合你的账单。 XML-RPC是最重要的结果之一,并且有许多C ++实现:

http://www.xmlrpc.com/directory/1568/implementations

编辑:经过一些谷歌搜索后,我找不到一个能够完全满足您要求的库。它们似乎都是阻塞或异步多线程。如果你真的需要实施限制#2,那么你将不得不手动完成。使用boost::asio将是跨平台通信的良好起点。我仍然没有看到你想要做什么和在第二个线程中调用处理函数而第一个线程阻塞时的区别,但是......