52 votes

Il existe une bonne et simple bibliothèque RPC pour les appels inter-processus ?

Je dois envoyer une (probablement une seule) commande simple à sens unique des processus clients vers le processus serveur avec des arguments de types C++ intégrés (donc la sérialisation est assez simple). C++, Windows XP+.

Je cherche une bibliothèque qui ne nécessite pas de configuration compliquée, fournit une interface simple, ne nécessite pas des heures à des jours d'apprentissage et n'a pas de restrictions d'utilisation commerciale. Une solution simple pour un problème simple.

Boost.Interprocess est trop bas niveau pour cette tâche simple car il ne fournit pas d'interface RPC. Les sockets sont probablement trop complexes aussi car je n'ai pas besoin de communiquer entre machines. Il en va de même pour DCOM, CORBA, et autres. Des tuyaux nommés? Je ne les ai jamais utilisés, y a-t-il une bonne bibliothèque sur WinAPI? OpenMPI?

17voto

Tim Sylvester Points 14047

Je ne pense pas que les sockets soient vraiment excessifs. Les alternatives ont toutes leurs propres problèmes et les sockets sont bien plus supportés que les pipes nommés, la mémoire partagée, etc., car presque tout le monde les utilise. La vitesse des sockets sur le système local n'est probablement pas un problème.

Il y a Apache Thrift:

http://incubator.apache.org/thrift/

Il existe quelques implémentations RPC basées sur la bibliothèque de marshaling de Google protobuf:

https://github.com/google/protobuf/blob/master/docs/third_party.md#rpc-implementations

Il y a XML-RPC:

http://xmlrpc-c.sourceforge.net/

Si vos messages sont vraiment simples, je pourrais envisager d'utiliser des paquets UDP, alors il n'y a pas de connexions à gérer.

9voto

Imbrondir Points 423

Vous pourriez aimer ZeroMQ pour quelque chose comme ça. Peut-être pas autant un RPC complet, mais un framework de messagerie brute sur les octets que vous pourriez utiliser pour faire un RPC. C'est simple, léger et avec des performances impressionnantes. Vous pouvez facilement implémenter un RPC par-dessus. Voici un exemple de serveur tiré directement du manuel :

//
//  Serveur Hello World en C++
//  Lie le socket REP à tcp://*:5555
//  Attend "Hello" du client, répond avec "World"
//
#include 
#include 
#include 
#include 

int main () {
    //  Prépare notre contexte et socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Attend la prochaine demande du client
        socket.recv (&request);
        printf ("Received Hello");

        //  Faire un peu de 'travail'
        sleep (1);

        //  Envoyer une réponse au client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

Cet exemple utilise tcp://*.5555, mais utilise des techniques IPC plus efficaces si vous utilisez :

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

ou même le protocole inter-processus encore plus rapide :

socket.bind("inproc://path.for.client.to.connect");

6voto

dalle Points 9083

Si vous avez seulement besoin de prendre en charge Windows, j'utiliserais le RPC intégré à Windows. J'ai écrit deux articles d'introduction à ce sujet :

http://www.codeproject.com/KB/IP/rpcintro1.aspx
http://www.codeproject.com/KB/IP/rpcintro2.aspx

Vous pourriez utiliser le protocole ncalrpc si vous avez seulement besoin de communiquer entre processus locaux.

5voto

log0 Points 6367

Boost.MPI. Simple, rapide, évolutif.

#include 
#include 
#include 
#include 
namespace mpi = boost::mpi;

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

  std::stringstream ss;
  ss << "Bonjour, je suis le processus " << world.rank() << " sur " << world.size() << ".";

  world.send(1, 0, ss.str());
}

3voto

Ben Points 14995

Si vous travaillez uniquement sur Windows et avez vraiment besoin d'une interface C++, utilisez COM/DCOM. Cela est basé sur RPC (à son tour basé sur DCE RPC).

C'est extrêmement simple à utiliser - à condition de prendre le temps d'apprendre les bases.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X