3

我是 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 方法:

  1. 必须是本地唯一方法,我需要避免远程连接。

  2. 出于安全原因,当一个进程打开一个“通信通道”来发送/接收数据时,其他进程不能使用相同的“通道”(不像共享内存或 Boost Message Queue 可以在该通道上写入,或者NamedPipe 可以用给定名称打开其他实例),我想避免虚假/恶意过程。TCP 听起来不错,因为两个进程不可能在同一个端口上侦听(但不仅仅是本地的)。

3-进程“A”将是一个服务,一些进程“B”也将作为服务运行,而其他进程“B”将作为非特权用户运行,所以这不能是管理员独有的功能。

4- 这个项目将是代码封闭的,所以我不能使用基于 GPL 许可证的代码/库。

5- 如果可能,跨平台(Windows/Linux/MacOS/FreeBSD)。

有人可以建议一种合适的 IPC 技术,无论是内置在操作系统中还是需要第三方库?

4

1 回答 1

3

简短的回答:

  • 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

于 2013-07-01T12:12:53.030 回答