C# 向所有工作站发送事件的最佳方式是什么

C# 向所有工作站发送事件的最佳方式是什么,c#,wcf,web-services,tcp,udp,C#,Wcf,Web Services,Tcp,Udp,我希望有人能指引我,因为我被困住了。。。我需要编写一个紧急广播系统,通知工作站发生紧急情况,并在用户屏幕底部弹出一条小消息。这似乎很简单,但在多个子网上大约有4000个工作站。该系统需要几乎实时、轻量级,并且易于作为windows服务部署 当我发现路由器不转发UDP广播数据包x.x.x.255时,问题就开始了。后来,我在VB6中做了一个简单的测试钩子来捕获网络发送的消息,但即使这些消息也没有通过路由器。我还编写了一个简单的数据包嗅探器来过滤数据包,结果发现网络数据包从未到达预定的目的地 然后我查

我希望有人能指引我,因为我被困住了。。。我需要编写一个紧急广播系统,通知工作站发生紧急情况,并在用户屏幕底部弹出一条小消息。这似乎很简单,但在多个子网上大约有4000个工作站。该系统需要几乎实时、轻量级,并且易于作为windows服务部署

当我发现路由器不转发UDP广播数据包x.x.x.255时,问题就开始了。后来,我在VB6中做了一个简单的测试钩子来捕获网络发送的消息,但即使这些消息也没有通过路由器。我还编写了一个简单的数据包嗅探器来过滤数据包,结果发现网络数据包从未到达预定的目的地

然后我查看并探索了使用MSMQ over HTTP,但这需要在目标工作站上安装IIS。由于有这么多工作站,这将是一个主要的安全问题

现在,我已经完成了一个带有异步回调的web服务,它向订阅者发送事件。它可以在小规模上完美工作,但一旦有超过15个用户,性能就会大大降低。轮询服务器实际上不是一个选项,因为它将在服务器上生成负载(另外我也尝试过)

我需要你的帮助来指导我使用什么技术。有没有人在这么多客户机上使用comet方式,或者我应该看看WCF

我正在使用Visual C#2005。请帮我摆脱这个困境


谢谢

我认为这个问题最好用socket解决


打开与服务器的连接,并使其保持打开状态。

在每个子网中是否都有一个从属服务器,负责将消息分发到子网中的所有客户端


然后,您可以将从属服务器连接到发起消息的中央服务器。

考虑使用WCF回调机制和事件。这是朱瓦尔·洛伊写的

另一种模式是实现。例如,GMail聊天就是这样工作的。但是,您必须在这里处理会话和超时。当客户端位于NAT和防火墙之后且无法直接访问时,它就可以工作。但对于内部网中的简单警报来说,它可能太复杂了

我想你们中的一些人对这件事想得太多了。每个版本的Windows都内置了一项服务,提供了这一确切的功能!它被称为信使服务。您所要做的就是确保此服务已启用并在所有客户端上运行

(虽然您在问题中没有具体说明,但根据您选择的技术,我假设此网络的客户端人口都是Windows)

您可以使用此功能从命令行发送消息,如下所示:

NET SEND computername "This is a test message"
NET SEND命令还具有按Windows域发送的选项,或按名称发送给特定用户(无论他们登录到何处),或发送给连接到特定Windows服务器的每个系统。这些选项可以让您轻松避免子网问题,尤其是在网络上使用基于域的安全性时。(如果您通过服务器而不是直接向客户端发送消息,则可能需要在某些服务器上启用“警报”服务)

这个编程版本是一个叫做API的API,非常简单。快速扫描P/Invoke.net会发现一个不仅提供了调用API所需的定义,而且还提供了一个C#示例程序

您根本不需要编写任何客户端代码。可能最复杂的事情是找出对这个API的最佳调用集,从而在您的配置中完全覆盖网络

ETA:我刚刚注意到Messenger服务和此API在Windows Vista中完全消失了。微软完全删除这样的功能是非常奇怪的。看来,对于Vista来说,这正是它的设计初衷

正常的网络广播(根据定义)保留在本地子网中,不会通过路由器转发


另一方面,多播传输可以有不同的范围,从子网本地到站点本地,甚至到全局。您所需要的只是将您的子网连接在一起的各种路由器具有多播意识。

您是对的,但我认为我无法获得硬件。大约有50个子网,这意味着一台服务器有50个tcp连接,每个连接到多个udp客户端。因此,我需要客户机能够“指定”自己作为从机,以防工作站重新启动/等等。你会为此推荐WCF吗?这可能会成为一个配置噩梦。我建议在每个子网中有几个从机,以防其中一个从机在通知主机之前停机。(多次收到同一事件的通知总比完全不收到好——您可以忽略客户端上的后续相同通知)打开与服务器的连接是有效的。打开4000个套接字可能会奏效,但我担心它的扩展性不会太好。谢谢Tim,我认为vista不会成为问题,因为我们可能会跳过该版本;)我确实尝试过这个选项,但问题是我无法在客户端捕获数据包以阻止默认消息框。我应该使用数据包捕获在客户端捕获它吗?为什么要捕获它,您的问题指定了一条弹出消息?好吧,你可以建立你自己的服务,做同样的事情信使。它基本上是使用NETBIOS API来侦听这些传入消息,然后启动MessageBox。messenger服务使用NETBIOS,而NETBIOS又使用广播数据包,这些数据包不经过路由器…MSMQ不需要IIS。。。