实现IPC的方式

Windows上实现IPC的首选方法是什么?

我知道几个像:命名pipe道,共享内存,信号灯? ,也许COM(虽然我不知道如何)…

我想知道什么被认为是最健壮,最快,最不容易出错和容易维护/理解。

Solutions Collecting From Web of "实现IPC的方式"

看看boost :: interprocess 。

共享内存大概是最快的,但有点容易出错并且局限于本地进程。

COM完全版本化,并自动支持远程IPC,但显然它是平台特定的。

对于大规模应用程序,您可能需要考虑像ActiveMQ或OpenMQ 。

几年前,我们研究了客户端和服务器在同一台机器上运行的客户/服务器情况, 当时,即使客户端和服务器在同一台机器上,我们也使用套接字(UDP)。 对我们来说,“最好的”竟然是与命名信号共享的内存来同步它。 当时,我主要研究管道与原始共享内存实现。 我测试了具有重叠I / O和I / O完成端口的管道。

我测试了各种各样的数据大小。 在客户端和服务器之间来回传递1个字节的低端,原始共享内存实现最快,达到3倍。当我传递10,000个字节时,管道实现和原始共享内存实现都是大约相同的速度。 我正在使用4K缓冲区,如果我记得与共享内存的实现正确。

对于所有数据大小,共享内存测试的速度比使用套接字快2到6倍(与TCP相比)。

在管道实现之间,当传递少量数据时,重叠的I / O版本比I / O完成端口版本快大约30%。 再次,更大的数据块,差异很小。

编码的管道实现当然要简单得多。 但是我们处理了大量来回传递的数据,因此使用命名信号实现共享内存版本是非常复杂的。

当然,如前所述,这是几年前的事情,如果我正确地实施了所有不同的测试,你是不知道的。 还要注意,这是与一个客户端。 我们的共享内存通信的最终实现对于数百个“客户端”的运行确实很好。 但是我不知道这个规模比管道实施更好。

MSDN有一个很好的总结。

这就是说,我认为你应该考虑使用第三方库。 Boost应该是好的 – 在另一个答案中已经提到 – 而且你的GUI工具包也可能有一些抽象。

对于纯Win32,匿名管道必须是最简单的方法(只需调用CreatePipe并使用两个生成的文件句柄;对于全双工,双重一切),但是它的缺点是只有在两个进程都在同一台机器,并且你必须在进程之间有一些通信手段才能通过句柄。

无论是RPC /进程外的COM或DCOM(它最终都会使用RPC)是在Windows中执行IPC的首选方法,除非你正在做一些非常简单的事情 – 我已经看到了很多人下了命名管道的路线,并最终基本上重新实现什么DCOM给你免费的 。 不要犯同样的错误:)

在我命名的管道上运输

数据格式要么滚动你自己的或使用本地RPC(这是什么msft使用)