寻找或建立进程间广播通信信道

时间:2011-02-15 17:38:42

标签: c# .net c++ ipc broadcast

因此,我们的产品有一些不寻常的需求。我们在本地主机上运行了许多进程,需要构建它们之间的通信方式。困难在于......

  1. 没有'服务器'或主进程
  2. 消息将广播到所有侦听节点
  3. 节点是所有Windows进程,但可能是C ++或C#
  4. 节点将同时以32位和64位运行
  5. 任何节点都可以随时跳入/跳出对话
  6. 异常终止的进程不应对其他节点产生负面影响
  7. 缓慢响应的进程也不应对其他节点产生负面影响
  8. 节点不需要“收听”广播消息
  9. 一些更重要的细节......

    我们需要发送的“消息”本质上是微不足道的。消息类型的名称和单个字符串参数就足够了。

    通信不一定安全,不需要提供任何身份验证或访问控制手段;但是,我们希望通过Windows登录会话对通信进行分组。这里可能感兴趣的是,非升级过程应该能够与升级过程相互作用,反之亦然。

    我的第一个问题:是否有一个现有的开源库?或者可以用来轻松实现这一目标的东西。截至目前,我还没有找到任何东西:(

    如果某个库不存在,那么......您将使用哪些技术来解决此问题?套接字,命名管道,内存映射文件,事件句柄?似乎基于连接的传输(套接字/管道)在完全连接的图形中是个坏主意,因为n个节点需要n(n-1)个连接。使用事件句柄和某种形式的共享存储似乎是目前最合理的解决方案......

    更新

    • 它必须可靠且有保证吗?是的,不是......让我们说,如果我正在倾听,并且我在合理的时间内做出回应,那么我应该总是得到这个消息。

    • 典型的邮件大小是什么?少于100个字节,包括消息标识符和参数。这些都很小。

    • 我们在谈论什么消息?低吞吐量是可以接受的,每秒10次会很多,平均使用率大约是每分钟1次。

    • 涉及的流程数量是多少?我希望它处理0到50之间,平均值在5到10之间。

4 个答案:

答案 0 :(得分:1)

我不知道任何已经存在的东西,但你应该能够用以下的组合来构建:

  • 内存映射文件
  • 活动
  • 互斥
  • 信号量

这可以通过不需要“主”进程的方式构建,因为所有这些都可以创建为命名对象,然后由OS管理,直到最后一个客户端使用它们时才销毁。基本思想是,第一个启动过程创建所需的对象,然后所有其他进程连接到那些。如果第一个进程关闭,只要至少有一个其他进程正在维护它们的句柄,对象就会保留。

内存映射文件用于在进程之间共享内存。互斥锁提供同步以防止同时更新。如果您想允许多个读者或一个编写器,您可以使用几个互斥锁和一个信号量来构建类似读取器/写入器锁的东西(请参阅Is there a global named reader/writer lock?)。事件用于在发布新消息时通知所有人。

我挥手告诉了一些重要的技术细节。例如,知道何时重置事件有点困难。您可以将每个应用轮询更新。

但走这条路线将提供一种无连接的信息共享方式。它不需要“服务器”进程始终在运行。

为了实现,我建议用C ++实现它,让C#程序通过P / Invoke调用它。或者也许在C#中让C ++应用程序通过COM interop调用它。当然,这是假设您的C ++应用程序是本机而不是C ++ / CLI。

答案 1 :(得分:1)

我从来没有尝试过这个,但理论上它应该有效。正如我在评论中提到的,在loopback设备上使用UDP端口。然后,所有进程都可以从/向此套接字读取和写入。正如你所说,消息很小,所以应该适合每个数据包 - 可能你可以看看谷歌的协议缓冲区之类的东西来生成结构,或者只是将结构复制到数据包中发送,在另一端,转换。鉴于它全部在本地主机上,您没有任何对齐,网络订单类型问题需要担心。要支持不同类型的消息,请确保可以检查类型的公共标题,以便您可以向后兼容。

...分钱小费

答案 2 :(得分:0)

我认为一个更重要的考虑因素是性能,我们谈论的是什么消息率,没有。进程? 无论哪种方式,您都依赖于允许通信需求的“主”,无论是自定义服务还是提供的系统(管道,消息队列等)。

如果您不需要跟踪和查询过去的消息,我认为您应该考虑打开命名管道的死简单服务 - 允许所有其他进程以PipeClient的形式读取或写入它。如果我没弄错的话,它会检查列表中的所有项目。

答案 3 :(得分:0)

你要找的是Mailslots!

请参阅CreateMailslot: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365147(v=vs.85).aspx