gpt4 book ai didi

c# - 查找或构建进程间广播通信 channel

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:33 24 4
gpt4 key购买 nike

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

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

一些更重要的细节...

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

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

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

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

更新

  • 它必须是可靠和有保证的吗?是的,也不是……假设我在倾听,并且在合理的时间内做出回应,那么我应该总能收到消息。

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

  • 我们谈论的消息速率是多少?低吞吐量是可以接受的,每秒 10 次就很多了,平均使用量约为每分钟 1 次。

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

最佳答案

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

  • 内存映射文件
  • 事件
  • 互斥体
  • 信号量

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

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

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

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

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

关于c# - 查找或构建进程间广播通信 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com