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

csh*_*net 6 .net c# c++ ipc broadcast

所以我们在产品中有这种不寻常的需求.我们在本地主机上运行了许多进程,需要构建它们之间的通信方式.困难在于......

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

一些更重要的细节......

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

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

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

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

更新

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

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

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

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

Jim*_*hel 1

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

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

这可以以不需要“主”进程的方式构建,因为所有这些都可以创建为命名对象,然后由操作系统管理,并且在最后一个客户端使用它们之前不会被销毁。基本思想是,启动的第一个进程创建您需要的对象,然后所有其他进程连接到这些对象。如果第一个进程关闭,只要至少有一个其他进程维护它们的句柄,这些对象就会保留下来。

内存映射文件用于在进程之间共享内存。互斥体提供同步以防止同时更新。如果您想允许多个读取器或一个写入器,您可以使用几个互斥锁和一个信号量构建类似读取器/写入器锁的东西(请参阅是否有全局命名的读取器/写入器锁?)。事件用于在发布新消息时通知每个人。

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

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

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

  • 我终于走了这条路,基于命名事件构建的生成类位于:http://csharptest.net/browse/src/Library/IpcChannel/IpcEventChannel.cs (3认同)