草庐IT

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

coder 2024-02-05 原文

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

  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/

有关c# - 查找或构建进程间广播通信 channel的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

随机推荐