具有多个独立组的本地进程的IPC方法

时间:2013-07-01 11:17:03

标签: c++ ipc

我是IPC的新手,我正在尝试实施一种安全的IPC方法(与加密无关)。

我正在使用Visual Studio 2010开发一个C ++系统(但将移植到其他平台Linux / MacOS / FreeBSD),这个系统有一个需要接收的进程“A”并将XML发送到其他进程“B “在同一台计算机上,但会存在14个过程,例如”B“(B1,B2,...,B14)需要向进程”A“发送/接收XML。

进程“A”将充当每个进程“B”之间的代理/桥接,进程“B”必须发送的所有数据/ XML将被发送到进程“A”,并且只是进程“ “将把数据/ XML发送到进程”B“。

我正在寻找一种在方法“A”和“B1 ... B14”之间交换这种数据的IPC方法。共享内存听起来不错,但任何进程都可以写入/读取地址,因此这不安全(我知道可以设置权限访问)。

我正在尝试找到一种IPC方法:

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

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

  3. 3-流程“A”将是一项服务,某些流程“B”也将作为服务运行,而其他流程“B”将作为非特权用户运行,因此这不一定是仅限管理员的功能。

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

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

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

1 个答案:

答案 0 :(得分: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