具有多个单独组的本地进程的 IPC 方法
Posted
技术标签:
【中文标题】具有多个单独组的本地进程的 IPC 方法【英文标题】:IPC methods for local processes with multiple separate groups 【发布时间】:2013-07-01 11:17:02 【问题描述】:我是 IPC 新手,我正在尝试实现一种安全的 IPC 方法(与加密无关)。
我正在使用 Visual Studio 2010 用 C++ 开发一个系统(但将移植到其他平台 Linux/MacOS/FreeBSD),该系统有一个进程“A”,需要接收 XML 并将其发送到其他进程“B” ”在同一台计算机上,但将存在大约 14 个进程,例如“B”(B1、B2、...、B14),它们需要向进程“A”发送/接收 XML。
进程“A”将充当每个进程“B”之间的代理/桥梁,进程“B”必须发送的所有数据/XML,将被发送到进程“A”,而只有进程“ A”会将数据/XML 发送到进程“B”。
我正在寻找一种 IPC 方法来在进程“A”和“B1…B14”之间交换这些数据。共享内存听起来不错,但是任何进程都可以写入/读取该地址,所以这并不安全(我知道可以设置权限访问)。
我正在尝试寻找一种 IPC 方法:
必须是仅限本地的方法,我需要避免远程连接。
出于安全原因,当一个进程打开“通信通道”来发送/接收数据时,其他进程不能使用相同的“通道”(不像共享内存或 Boost Message Queue写在这个频道上,或者 NamedPipe 可能打开其他实例与给定名称),我想避免虚假/恶意过程。 TCP 听起来不错,因为两个进程不可能在同一个端口上侦听(但不仅仅是本地)。
3- 进程“A”将是一个服务,一些进程“B”也将作为服务运行,而其他进程“B”将作为非特权用户运行,因此这不能是管理员独有的功能。
4- 该项目将关闭代码,因此我无法使用基于 GPL 许可的代码/lib。
5- 如果可能,跨平台 (Windows/Linux/MacOS/FreeBSD)。
有人可以建议一种合适的 IPC 技术,或者内置在操作系统中,或者需要第三方库吗?
【问题讨论】:
进程 A 可以生成 B 进程吗?这可能允许共享打开的 FD。另外,为什么不“只是”使用带有简单共享秘密身份验证的 Unix 套接字呢?这同样适用于更一般的 MQ。 "跨平台 (Linux/MacOS/FreeBSD)" - 所以你不需要 Windows 兼容性?在这种情况下,POSIX 有非常友好的四个你。 【参考方案1】:简答:
Win32 的 Windows 管道。 Linux(和系列)的匿名本地套接字。长答案:
在 Windows 平台上有以下常用的替代方案:
内存映射文件 命名管道 网络套接字(主要是 IP)不幸的事实是,以上都不是本地的。文件由存储访问共享,管道由于常见的 RPC/LPC 路由而可用,IP 受路由/转发配置的影响(即使使用环回)。
我个人建议在 Win32 上使用管道。它们的行为或多或少类似于 Linux 上的本地套接字(尽管存在一些差异)。
在 Linux 平台上:
共享内存 管道 本地套接字(包括匿名套接字)。管道和本地套接字是安全的,并且在不同的场景中它们都有自己的优势。由于您有多个客户端/单个服务器方案,我更喜欢本地 (AF_LOCAL) 套接字编程。您可以使用命名套接字(具有基于文件的访问控制)或匿名套接字。这两个选项都非常安全(除非攻击者获得本地访问权限)。
链接
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780(v=vs.85).aspx http://manpages.ubuntu.com/manpages/lucid/man7/unix.7.html
【讨论】:
以上是关于具有多个单独组的本地进程的 IPC 方法的主要内容,如果未能解决你的问题,请参考以下文章