2012-04-30 16 views
2

私は別のプロセス(Windows上)のオブジェクトのメンバ関数を呼び出すことができるRPCライブラリを探しています。C++リモートオブジェクトのメソッド呼び出し(RPC同様)

現在発生している問題は、Serversideオブジェクトの一部が既に存在し、複数のインスタンスを持っていることです。サーバは、ポインタ/識別子をクライアントに渡すことができるべきであり、クライアントは、リモートオブジェクトインスタンスへの呼び出しを指示するプロキシを実装する。それでは、私は基本的にしたいことは、このようなものです:

テストのインスタンスがすでにサーバー上に存在し、RemoteTestManagerは、クライアントが別のRPC呼び出しで取得したサーバ上のマネージャクラスである
Client: 
TestProxy test = RemoteTestManager.GetTestById(123); 
test.echo("bla"); 

。また、同じマシン上に複数のサーバーが存在する可能性があるため、名前付きパイプを使用することをお勧めします(実際はもっと簡単なIPC:Dのようになります)。

だから私の質問は、実際にある:C++のためにこのような何かがそこにあるのか、私は1つに

答えて

0

ZeroMQを自分自身をコーディングしなければならないのは、おそらく現時点で最高のIPCシステム外であると、かなり多様な組み合わせが可能になりますクライアント/サーバートポロジそれは本当に速くて効率的です。

どのようにサーバーオブジェクトにアクセスするかは、実装方法によって異なりますが、CORBAにはこの機能がありましたが、現在はCORBA(またはTBH)を使用しようとはしません。多くのRPCシステムでは、必要に応じてオブジェクトを作成したり、単一インスタンスに接続したりすることができます。あなたのために作成され、そのセッション中に呼び出されたオブジェクト(つまり、各クライアント用に作成され、生きているオブジェクト)に接続するオブジェクトに接続することは、まだまだ一般的です。オブジェクトのプールも合理的にも一般的です。しかし、これらのサーバーオブジェクトのライフタイムを管理する必要があります。あなたの管理方法については言及していないので、私は実際に助言することはできません。

名前付きパイプが必要なのか疑問に思っています.tcp/ip接続に固執します - ローカルホストへの接続は非常に軽量な操作です(この構成では実質的にゼロオーバーヘッドです)。より完全なRPCスタックのための低レベルのネットワークプロトコルバッファ経由でメッセージをシリアル化の面では

+0

もTCP/IP接続の問題は、私のサーバーは、ポートをリッスンする必要があることを、私は唯一の1つのサーバのリスニングを持つことができるということですポートごとに。私はソケットを使用する場合、私はちょうど私が聴きたいサーバーをソケットを取得するためのいくつかの種類のメソッドが必要になります名前付きパイプのための私はちょうど識別子としてサーバーのPIDを使用することができます。オブジェクトは実際にはサーバー自体によって実際には管理されていませんが、他のアプリケーションへのrpcアクセスを許可するためにサーバーをインポートする別のアプリケーションでは、RFCのようなガーベージコレクションを行うことはできません。 – ACB

1

COMについてはどうですか?あなたの要求に完全に合うようです。

+0

ええ、私はすべてのラッパークラスを書いてはいけません。私はエクスポートするオブジェクトの定義を変更することはできません – ACB

1

既に解決策を見つけている可能性があります。他の人の参考のために、あなたがここで質問したものと一致するライブラリを作成しました。ライブラリCppRemoteを見てください。

  • は、名前(のstd ::文字列)によって、サーバーでのオブジェクトへのポインタを取得:このライブラリには、その試合以下の機能あなたの記述を持っています。
  • サーバに既存のオブジェクト(非侵入型)をバインドし、クライアントからそのオブジェクトへのプロキシを取得します。
  • サーバは、既存のオブジェクトの複数のインスタンスにバインドできます。
  • 名前付きパイプトランスポートです。
  • 軽量で使いやすい。

サーバコード

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"); 
関連する問題