C++ 具有多个独立组的局部过程的IPC方法

C++ 具有多个独立组的局部过程的IPC方法,c++,ipc,C++,Ipc,我是IPC新手,我正在尝试实现一种安全的IPC方法(与加密无关) 我使用Visual Studio 2010开发了一个C++系统(但它将移植到其他平台Linux /MaOS/FreeBSD),这个系统有一个过程“A”,需要在同一台计算机上接收和发送XML到其他进程“B”,但是在14个进程中存在“B”(B1,B2,…,B14)。需要向进程“a”发送/接收XML 流程“A”将充当每个流程“B”之间的代理/桥梁,流程“B”必须发送的所有数据/XML将发送到流程“A”,而只有流程“A”将向流程“B”发送

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

我使用Visual Studio 2010开发了一个C++系统(但它将移植到其他平台Linux /MaOS/FreeBSD),这个系统有一个过程“A”,需要在同一台计算机上接收和发送XML到其他进程“B”,但是在14个进程中存在“B”(B1,B2,…,B14)。需要向进程“a”发送/接收XML

流程“A”将充当每个流程“B”之间的代理/桥梁,流程“B”必须发送的所有数据/XML将发送到流程“A”,而只有流程“A”将向流程“B”发送数据/XML

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

我试图找到一种IPC方法:

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

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

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

    4-此项目将关闭代码,因此我不能使用基于GPL许可证的代码/库

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


    有人能推荐一种合适的IPC技术,或者内置在操作系统中,或者需要第三方库吗?

    简短回答:

    • Win32的Windows管道
    • Linux(及其系列)的匿名本地套接字
    长答案:

    Windows平台上,有以下常用替代方案:

    • 内存映射文件
    • 命名管道
    • 网络套接字(主要是IP)
    不幸的是,以上这些都不是本地的。文件由存储访问共享,管道因公共RPC/LPC路由而可用,IP受路由/转发配置的约束(即使使用环回)

    我个人建议在Win32上使用管道。它们的行为或多或少类似于Linux上的本地套接字(尽管有些不同)

    Linux平台上:

    • 共享内存
    • 管道
    • 本地套接字(包括匿名套接字)
    管道和本地插座是安全的,在不同的场景中,它们都有各自的优点。由于您有多个客户机/单服务器场景,我倾向于本地(AF_local)套接字编程。您可以使用命名套接字(基于文件的访问控制),也可以使用匿名套接字。这两个选项都非常安全(除非攻击者获得本地访问权限)

    链接


    进程A是否可以生成进程B?这可能允许共享打开的FD。另外,为什么不“仅仅”使用带有简单共享秘密身份验证的Unix套接字呢?这同样适用于更通用的MQ。“跨平台(Linux/MacOS/FreeBSD)”——所以您不需要Windows兼容性?在这种情况下,POSIX为您提供了非常友好的东西。