什么是在Windows上实现IPC的首选方法?
我知道有几种方法,例如:命名管道、共享内存、信号量,或者可能是COM(虽然我不确定如何使用)...
我想知道哪种方法被认为是最健壮、最快、最少出错和易于维护/理解的。
什么是在Windows上实现IPC的首选方法?
我知道有几种方法,例如:命名管道、共享内存、信号量,或者可能是COM(虽然我不确定如何使用)...
我想知道哪种方法被认为是最健壮、最快、最少出错和易于维护/理解的。
我使用了各种数据大小进行测试。在客户端和服务器回显1个字节来回传输的低端,原始共享内存实现的速度是其他方法的3倍。当我来回传输10,000字节时,管道实现和原始共享内存实现的速度都差不多。如果我没记错的话,我使用4K缓冲区来实现共享内存。
对于所有数据大小,相比TCP,共享内存测试的速度范围在2倍到6倍之间。
在管道实现之间,当传输少量数据时,重叠I/O版本比I/O完成端口版本快约30%。同样,在传输更大的数据块时,差异很小。
管道实现肯定要简单得多。但是,我们处理了很多小块数据的来回传输,因此实现具有命名信号量的共享内存版本值得额外的复杂性。
当然,这是几年前的事情,你不知道我是否正确地实施了所有不同的测试。还要注意,这是针对单个客户端的。我们的共享内存通信的最终实现非常适用于数百个运行的“客户端”。但我不知道在那种规模下,它是否比管道实现更好。
MSDN有一个很好的摘要。
话虽如此,我认为您应该考虑使用第三方库。Boost应该不错-正如另一个答案中所述-而您的GUI工具包也可能有一些抽象层。
对于纯Win32,匿名管道应该是最简单的方法(您只需调用CreatePipe并使用得到的两个文件句柄即可;对于全双工,需要将其加倍),但它的缺点是仅在两个进程都运行在同一台机器上时才有效,并且您必须已经有某种手段来传递句柄以便进行通信。
在Windows中,除非你正在做一些非常简单的事情,否则RPC / out-of-process COM或DCOM(最终将使用RPC)是进行IPC的首选方式 - 我已经看到很多人走向命名管道路线,并最终基本上重新实现了DCOM免费提供给您的内容。不要犯同样的错误:)
为我提供命名管道传输
对于数据格式,可以自己编写或使用本地RPC(这是微软使用的方法)