C# UDP多播侦听器从错误的多播组中拾取消息

C# UDP多播侦听器从错误的多播组中拾取消息,c#,sockets,udp,multicast,C#,Sockets,Udp,Multicast,我正在编写一个服务,它通过网络发送多播消息,以便在我的服务的多个实例之间进行通信。我正在设置两个侦听器并发送两次消息(主NIC上为239.1.1.1,次NIC上为239.1.1.2),一切正常,但.2多播组上的次侦听器偶尔会接收发送到.1多播组的消息。知道为什么会这样吗 以下是我如何设置我的听众: PrimaryLocalEP = new IPEndPoint(primaryNIC.Address, vnc.DefaultUtilityPort); PrimaryClient.Exclusive

我正在编写一个服务,它通过网络发送多播消息,以便在我的服务的多个实例之间进行通信。我正在设置两个侦听器并发送两次消息(主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();

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


基本情况是,在NIC硬件识别出需要交付的数据包后,也就是说,在给定的多播组中,盒子上有一个进程,操作系统网络堆栈只使用端口号来识别等待UDP输入的进程。两个侦听进程中的哪一个获得数据包基本上是随机的。

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