0

我正在编写一个服务,它发送多播消息,以便在网络上我的服务的多个实例之间进行通信。我正在设置两个侦听器并发送两次消息(主 NIC 上的 239.1.1.1,辅助 NIC 上的 239.1.1.2)一切正常,但有时 .2 多播组上的辅助侦听器会接收发送到的消息.1 多播组。知道为什么会发生这种情况吗?

这是我设置听众的方式:

PrimaryLocalEP = new IPEndPoint(primaryNIC.Address, vnc.DefaultUtilityPort);
PrimaryClient.ExclusiveAddressUse = false;
PrimaryClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
PrimaryClient.Client.Bind(PrimaryLocalEP);
PrimaryClient.JoinMulticastGroup(IPAddress.Parse("239.1.1.1"), primaryNIC.Address);
PrimaryClient.MulticastLoopback = false;
PrimaryRemoteEP = new IPEndPoint(IPAddress.Parse("239.1.1.1"), vnc.DefaultUtilityPort);

ReadThread = new System.Threading.Thread(ReadConnection);
ReadThread.IsBackground = true;
ReadThread.Name = "UDPReadConnection";
ReadThread.Start();


SecondaryLocalEP = new IPEndPoint(secondaryNIC.Address, vnc.DefaultUtilityPort);
SecondaryClient.ExclusiveAddressUse = false;
SecondaryClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
SecondaryClient.Client.Bind(SecondaryLocalEP);
SecondaryClient.JoinMulticastGroup(IPAddress.Parse("239.1.1.2"), secondaryNIC.Address);
SecondaryClient.MulticastLoopback = false;
SecondaryRemoteEP = new IPEndPoint(IPAddress.Parse("239.1.1.2"), vnc.DefaultUtilityPort);

ReadThreadSecondary = new System.Threading.Thread(ReadSecondaryConnection);
ReadThreadSecondary.IsBackground = true;
ReadThreadSecondary.Name = "UDPReadConnectionSecondary";
ReadThreadSecondary.Start();
4

2 回答 2

1

简短的回答 - 将它们放在不同的端口上。

基本上发生的情况是,在 NIC 硬件识别出需要传递数据包后,即盒子上有一个进程,该进程具有给定多播组的成员资格,操作系统网络堆栈仅使用端口号来识别等待 UDP 输入的进程。您的两个侦听进程中的哪一个获取数据包本质上是随机的。

于 2012-07-18T14:52:00.593 回答
0

发生这种情况是因为默认情况下只有一个 NIC 是多播侦听器(由于内部算法取决于接口优先级,因此由操作系统拾取,因此建立的任何 VPN 连接都可能导致问题)。您必须明确设置SocketOptionName.MulticastInterface给定的 NIC 以使其始终参与多播侦听。

于 2013-02-09T19:34:50.673 回答