And*_*hko 52 c++ rpc interprocess
我需要使用内置C++类型的参数从客户端进程向服务器进程发送(可能是一个)简单的单向命令(因此序列化非常简单).C++,Windows XP +.
我正在寻找一个不需要复杂配置的库,提供简单的界面,不需要数小时的学习时间,也没有商业使用限制.解决简单问题的简单方法.
Boost.Interprocess对于这个简单的任务来说太低级了,因为它不提供RPC接口.套接字也可能是一种过度杀伤,因为我不需要在机器之间进行通信.关于DCOM,CORBA等人也是如此.命名管道?从未使用过它们,WinAPI上的任何好库?的openmpi?
Tim*_*ter 17
我不认为插座真的有点过分.替代方案都有自己的问题,并且套接字比命名管道,共享内存等更好地支持,因为几乎每个人都在使用它们.本地系统上的套接字速度可能不是问题.
有Apache Thrift:
http://incubator.apache.org/thrift/
作为编组机制,有一些RPC实现包含在Google的protobuf库中:
https://github.com/google/protobuf/blob/master/docs/third_party.md#rpc-implementations
有XML-RPC:
http://xmlrpc-c.sourceforge.net/
如果您的消息非常简单,我可能会考虑使用UDP数据包,然后没有可以管理的连接.
你可能喜欢ZeroMQ这样的东西.也许不是一个完整的RPC,可以用作生成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;
}
Run Code Online (Sandbox Code Playgroud)
此示例使用tcp://*.5555,但如果您使用以下命令,则使用更高效的IPC技术:
socket.bind("ipc://route.to.ipc");
Run Code Online (Sandbox Code Playgroud)
甚至更快的线程间协议:
socket.bind("inproc://path.for.client.to.connect");
Run Code Online (Sandbox Code Playgroud)
如果你只需要支持Windows我会使用Windows内置的RPC,我写了两篇关于这个的介绍性文章:
http://www.codeproject.com/KB/IP/rpcintro1.aspx
http://www.codeproject.com/KB/IP/rpcintro2.aspx
ncalrpc如果您只需要本地进程间通信,则可以使用该协议.
Boost.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());
}
Run Code Online (Sandbox Code Playgroud)