c# - MSMQ - 无法从多播队列接收

标签 c# msmq multicast

我正在努力了解多播在 MSMQ 中的工作原理,但我根本无法接收消息,即使是来自同一台机器。我显然做错了什么,但看不到什么。

这是我所在的地方:

我手动创建了一个名为 MulticastTest 的非事务性专用队列,然后将多播地址设置为 234.1.1.1:8001。然后我的测试发送应用程序执行此操作:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
queue.Send("Hello World");

这行得通,它至少似乎发送了我在同一台机器上的传出队列中看到的消息。至少我认为这是正确的,请告诉我是否正确。

所以现在我尝试运行我的接收应用程序(在同一台机器上或配置为相同多播地址的不同机器上),但我无法让它工作。如果我尝试这样做:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
var message = queue.Receive();

它根本行不通,Receive() 方法抛出一个异常说:

The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted

如果我尝试将接收队列设置为 .\private$\MulticastTest 它至少会等待一条消息但什么也没有发生,所有消息仍然留在传出队列中。

那我做错了什么? MSMQ 是否需要运行某种服务才能从传出队列发送消息?

我还尝试根据 this question 向匿名用户授予完全权限但这没有影响。

最佳答案

经过多次试验,我终于找到了使多播队列正常工作所需的正确步骤。

首先,确保您已经安装了 MSMQ 多播功能!尽管能够在我的其中一台服务器上创建具有多播地址的队列,但服务器管理器实际上告诉我该组件未安装。

在我的本地机器上尝试之后,我在我的事件日志中发现了这条消息:

Message Queuing found multiple IP addresses for the local computer. Message Queuing will use the default IP address determined by the PGM driver for multicast messages. To use a different IP address, set the \HKLM\Software\Microsoft\MSMQ\Parameters\MulticastBindIP registry value to one of the following valid IP addresses: [IP addresses listed here]

原来我的局域网有多个 IP 地址,所以我首先使用发送消息所需的正确 IP 地址添加了这个注册表项,然后重新启动消息队列服务。可以在此处找到更多详细信息:https://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

接下来,我必须为 ANONYMOUS LOGON 用户向我的消息队列添加权限,因此我(至少)授予了接收和发送权限。

现在发送一些东西。您需要的队列名称的正确格式如下:

FormatName:MULTICAST=234.1.1.1:8001

或者您的多播 IP 地址/端口是什么。我的发送应用程序现在发送了消息,我可以看到它现在出现在我的私有(private)队列中,该队列与该多播地址相关联。这意味着消息肯定已经发送。

在接收端,我需要监听私有(private)队列(不是上面的组播格式),所以监听:

.\private$\MulticastTest

最后我看到我发送的消息出现在接收端。

作为健全性检查,我设置了另一个队列指向同一个多播地址(确保在那台机器上我遵循了上述相同的步骤),现在可以从一台机器发送一条消息并让多台机器接收它。

我希望这个答案对其他人有帮助,因为这对我来说是一次真正的试错。

关于c# - MSMQ - 无法从多播队列接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435706/

相关文章:

permissions - Windows 2008 Server 上的默认 MSMQ 专用队列权限是什么

Java MulitcastSocket 接收方法 "Blocks a Program"?

java - 如何在Java中发现多播地址范围?

c# - 从 Windows 服务启动 Windows 应用程序

c# - 用鼠标绘制线渲染器然后从起点缩短它(飞行控制样式)

c# - 如何使用 MessageQueue 检测连接中断

windows - ping 224.0.0.1 无回复

c# - 基于流获取数据

c# - 什么更好 : id ? ? 0 == 0 或 id == null ||编号 == 0?

windows-7 - Win2008 R2 上的 MSMQ 不会收到来自旧客户端的消息