56

組み込みの C++ 型の引数を使用して、(おそらく 1 つの) シンプルな一方向コマンドをクライアント プロセスからサーバー プロセスに送信する必要があります (したがって、シリアル化は非常に簡単です)。C++、Windows XP+。

複雑な構成を必要とせず、シンプルなインターフェイスを提供し、何時間も何日も学習する必要がなく、商用利用の制限がないライブラリを探しています。シンプルな問題のシンプルなソリューション。

Boost.Interprocessは、RPC インターフェイスを提供しないため、この単純なタスクには低レベルです。マシン間で通信する必要がないため、ソケットもおそらくやり過ぎです。DCOM、CORBAなどについても同じです。名前付きパイプ?それらを使用したことはありません.WinAPI上の優れたライブラリはありますか? OpenMPI?

4

12 に答える 12

9

このようなものにはZeroMQが好きかもしれません。RPC を作成するために使用できる raw バイト メッセージング フレームワークほど、完全な RPC ではない可能性があります。シンプルで軽量で、印象的なパフォーマンスを備えています。その上に RPC を簡単に実装できます。マニュアルから直接引用したサーバーの例を次に示します。

//
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Wait for next request from client
        socket.recv (&request);
        printf ("Received Hello");

        //  Do some 'work'
        sleep (1);

        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

この例では tcp://*.5555 を使用していますが、以下を使用すると、より効率的な IPC 手法が使用されます。

socket.bind("ipc://route.to.ipc");

またはさらに高速なスレッド間プロトコル:

socket.bind("inproc://path.for.client.to.connect");
于 2011-03-25T20:24:34.587 に答える
6

Windows のみをサポートする必要がある場合は、Windows の組み込み RPC を使用します。これに関する紹介記事を 2 つ書きました。

http://www.codeproject.com/KB/IP/r
​​pcintro1.aspx http://www.codeproject.com/KB/IP/r​​pcintro2.aspx

ncalrpcローカルのプロセス間通信のみが必要な場合は、このプロトコルを使用できます。

于 2011-03-29T19:41:59.180 に答える
5

ブースト.MPI . シンプル、高速、スケーラブル。

#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <iostream>
#include <sstream>
namespace mpi = boost::mpi;

int main(int argc, char* argv[]) 
{
  mpi::environment env(argc, argv);
  mpi::communicator world;

  std::stringstream ss;
  ss << "Hello, I am process " << world.rank() << " of " << world.size() << ".";

  world.send(1, 0, ss.str());
}
于 2011-03-31T20:29:52.237 に答える
3

Windowsのみで作業していて、本当にC ++インターフェイスが必要な場合は、COM/DCOMを使用してください。これはRPCに基づいています(次にDCE RPCに基づいています)。

使い方は非常に簡単です。時間をかけて基本を学ぶことができれば。

于 2011-04-02T06:24:35.167 に答える
2

使いやすさにはほど遠いことを私は知っています。もちろん、CORBA に固執することもできます。例:ACE/TAO

于 2011-03-31T15:38:48.957 に答える
2

おそらくライブラリさえ必要ありません。Windows には、そのコア API (windows.h) に深く組み込まれた IPC メカニズムがあります。基本的に、Windows メッセージを別のプロセスのメイン ウィンドウのメッセージ キューに投稿できます。Windows では、それを行うための標準メッセージ WM_COPYDATA も定義されています。


送信プロセスは基本的に次のことを行います。

受信プロセス (ウィンドウ):

于 2011-03-30T11:34:29.873 に答える
1

また、 msgpack-rpcを見るかもしれません

アップデート

Thrift / Protobufの方が柔軟性が高いと思いますが、特定の形式でコードを記述する必要があります。たとえば、Protobufには、いくつかのクラスを生成する、パッケージから特定のコンパイラを使用してコンパイルできる.protoファイルが必要です。場合によっては、コードの他の部分よりも難しい場合があります。msgpack-rpcははるかに単純です。余分なコードを書く必要はありません。次に例を示します。

#include <iostream>

#include <msgpack/rpc/server.h>
#include <msgpack/rpc/client.h>

class Server: public msgpack::rpc::dispatcher {
public:
    typedef msgpack::rpc::request request_;

    Server() {};

    virtual ~Server() {};

    void dispatch(request_ req)
    try {
        std::string method;
        req.method().convert(&method);

        if (method == "id") {
            id(req);
        } else if (method == "name") {
            name(req);
        } else if (method == "err") {
            msgpack::type::tuple<> params;
            req.params().convert(&params);
            err(req);
        } else {
            req.error(msgpack::rpc::NO_METHOD_ERROR);
        }
    }
    catch (msgpack::type_error& e) {
        req.error(msgpack::rpc::ARGUMENT_ERROR);
        return;
    }
    catch (std::exception& e) {
        req.error(std::string(e.what()));
        return;
    }

    void id(request_ req) {
        req.result(1);
    }

    void name(request_ req) {
        req.result(std::string("name"));
    }

    void err(request_ req) {
        req.error(std::string("always fail"));
    }
};

int main() {
    // { run RPC server
    msgpack::rpc::server server;
    std::auto_ptr<msgpack::rpc::dispatcher> dispatcher(new Server);
    server.serve(dispatcher.get());
    server.listen("0.0.0.0", 18811);
    server.start(1);
    // }

    msgpack::rpc::client c("127.0.0.1", 18811);
    int64_t id = c.call("id").get<int64_t>();
    std::string name = c.call("name").get<std::string>();

    std::cout << "ID: " << id << std::endl;
    std::cout << "name: " << name << std::endl;

    return 0;
}

出力

ID: 1
name: name

ここで見つけることができるより複雑な例https://github.com/msgpack/msgpack-rpc/tree/master/cpp/test

于 2013-01-04T11:38:54.847 に答える
0

ここにあるWindows用のXmlRpc C ++を使用しています

本当に使いやすいです:)しかし、これが唯一のクライアントであるという唯一の副作用です!

于 2011-03-31T09:03:48.897 に答える
0

Microsoft Messaging Queueingもあります。これは、すべてのプロセスがローカル マシン上にある場合に使用するのが非常に簡単です。

于 2011-04-02T14:54:31.530 に答える
-3

プロセス間通信の最も簡単な解決策は、ファイルシステムを使用することです。リクエストとレスポンスは、一時ファイルとして書き込むことができます。要求ファイルと応答ファイルの命名規則を作成できます。

これで最高のパフォーマンスが得られるわけではありませんが、それで十分な場合もあります。

于 2011-03-30T10:41:57.423 に答える