我正在寻找一种机制来创建一个简单的多对多消息传递系统,允许Windows应用程序在一台机器上进行通信,但可以跨会话和桌面进行通信。
我有以下严格要求:
I不需要保证消息的传递。
我看过很多很多选择。这是我对想法的最后请求。
下列行为因违反上述一项或多项要求而被拒绝:
ZeroMQ:为了进行多到多的消息传递,需要一个中央代理。
命名管道:需要中央服务器接收并转发消息。
多播套接字:需要具有有效IP地址(即全局配置)的正确配置的网卡。
共享内存队列:要在全局命名空间中创建共享内存,需要提升权限。
多播套接字几乎可以工作。还有人能提出什么建议吗?我会考虑任何东西,从预先打包的库到裸露的Windows功能。
(9月27日编辑)更多一些上下文:
所谓“中央协调器/代理/服务器”,我指的是在应用程序试图发送消息时必须运行的单独进程。我所看到的问题是,在需要的时候,不可能保证这个过程真的会运行。通常会使用Windows服务,但无法保证在任何用户登录之前始终启动特定服务,也无法保证该服务不会因某种原因而停止。在服务启动时发送第一条消息时,“按需运行”会导致延迟,并引发特权问题。
多播套接字几乎可以工作,因为它能够完全避免中央协调进程的需要,并且不需要来自发送或接收多播数据包的应用程序的提升权限。但是您必须有一个配置好的IP地址--您不能在回送接口上进行多播(即使在配置的网卡上使用TTL=0的多播行为与人们预期的环回多播行为一样)--这就是打破协议的关键。
发布于 2011-10-11 12:10:45
最后,我决定,其中一个困难的要求必须走,因为问题不能以任何合理的方式解决,正如最初所说的。
我的最后一个解决方案是运行命名管道服务器的Windows服务。任何应用程序或服务都可以连接到管道的实例并发送消息。服务器接收的任何消息都回显到所有管道实例。
我真的很喜欢p.marino的答案,但最终它看起来非常复杂,因为它是一个非常基本的功能。
另一种吸引我的可能性,尽管它再次陷入了复杂性的障碍,就是编写一个内核驱动程序来管理多播。在这种情况下可能有几种机制,但是编写一个没有bug的内核驱动程序的开销太高了。
发布于 2011-09-26 13:09:20
也许我完全误解了这个问题,尤其是“没有中央经纪人”,但是你有没有考虑过基于元组空间的一些东西?
-在意见交换后,请考虑以下是我的“明确”答案:
使用基于文件的解决方案,并在拉米德上承载目录树以确保良好的性能。
我还建议查看下面的StackOverflow讨论 (即使是基于Java的),看看如何管理文件系统上的锁定和事务的可能指针。
这一个 (基于.NET的)也可能有帮助。
发布于 2011-09-26 12:41:18
UDP 广播业怎么样?
https://stackoverflow.com/questions/7555137
复制相似问题