2012-04-30 79 views
2

我正在搜索一個RPC庫,該庫允許我在另一個進程(在Windows上)調用對象的成員函數。C++調用遠程對象的方法(類似於RPC)

im當前遇到的問題是一些Serverside對象已經存在並且有多個實例。服務器應該能夠將指針/標識符傳遞給實現代理的客戶端,然後將代理指向遠程對象實例。所以我基本上要的是這樣的:

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

這裏測試的實例已經存在於服務器上,並且RemoteTestManager的是,在另一個RPC調用獲得的客戶端服務器上的管理器類。另外它應該優先運行在命名管道上,因爲在同一臺機器上可能有多個服務器(實際上我想更像一個簡單的IPC:D)。

所以我的問題其實是:是否有這樣的事情對於C++在那裏還是我必須編寫一個自己

回答

0

ZeroMQ可能是最好的IPC系統出來的那一刻,並允許相當豐盛的組合客戶端/服務器拓撲。它也非常快速和高效。

如何訪問服務器對象取決於它們是如何實現的,CORBA有這個功能,但我現在不會嘗試使用CORBA(或TBH)。許多RPC系統允許您根據需要創建對象,或者連接到單個實例。連接到爲您創建的對象,並在該會話期間保留給每個呼叫(即爲每個客戶創建的對象並保持活動狀態)仍然相當常見。對象池也相當普遍。但是,您必須管理這些服務器對象的生命週期,並且我不能真正提醒您,因爲您沒有說明如何管理這些對象。

我懷疑你想命名管道,堅持到TCP/IP連接 - 連接到本地主機是一款非常輕便的操作(COM實際上是此配置中的零開銷)。

+0

以及與TCP/IP連接的問題是,我的服務器需要偵聽端口和我只能有一個服務器偵聽每個端口。對於命名管道,我可以只使用服務器的pid作爲標識符,如果我要使用套接字,我需要某種方法來獲取我想要監聽的服務器的套接字。那麼對象實際上並不是真的由服務器本身管理,而是由另一個導入服務器的應用程序來授予對其他程序的rpc訪問權限,所以我不能像RFC那樣有任何垃圾收集。 – ACB

1

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

+0

好啊,但我不想寫封裝類的一切。和scince我不能改變我想出口的對象的定義我不能使用COM – ACB

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"); 
相關問題