3

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

現在発生している問題は、サーバーサイド オブジェクトの一部が既に存在し、複数のインスタンスを持っていることです。サーバーは、呼び出しをリモート オブジェクト インスタンスに転送するプロキシを実装するクライアントにポインタ/識別子を渡すことができる必要があります。だから私が基本的に欲しいのは次のようなものです:

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

ここで、Test のインスタンスはサーバー上に既に存在し、RemoteTestManager はクライアントが別の rpc 呼び出しで取得したサーバー上のマネージャー クラスです。また、同じマシンに複数のサーバーが存在する可能性があるため、名前付きパイプを介して実行することをお勧めします(実際には、簡単なIPCのようにしたい:D)。

だから私の質問は実際には次のとおりです。C ++にこのようなものはありますか、それとも自分でコーディングする必要がありますか

4

5 に答える 5

2

ネットワーク全体でメッセージを低レベルでシリアル化するという点では、プロトコル バッファが一般的な選択です...

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

より完全な RPC スタックについては、Apache Thrift をご覧ください...

http://thrift.apache.org/

于 2012-05-01T00:19:16.903 に答える
1

COMはどうですか?要件に完全に適合しているようです。

于 2012-05-01T05:00:10.193 に答える
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");
于 2013-12-10T19:47:17.057 に答える
0

ZeroMQは、現時点でおそらく最高のIPCシステムであり、クライアント/サーバートポロジのさまざまな組み合わせを可能にします。そして、その本当に高速で効率的です。

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

名前付きパイプが必要なのではないかと思います。tcp/ip接続に固執してください。ローカルホストへの接続は非常に軽量な操作です(この構成では、COMは実質的にゼロオーバーヘッドです)。

于 2012-04-30T21:48:28.737 に答える