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

时间:2012-07-18 14:43:12

标签: c# sockets udp multicast

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

2 个答案:

答案 0 :(得分:1)

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

基本上发生的是,在NIC硬件识别出需要传送数据包之后,即在具有给定多播组成员资格的盒子上有一个进程,OS网络堆栈仅使用端口号来识别等待UDP输入的进程。它基本上是随机的,你的两个监听进程中的一个获取数据包。

答案 1 :(得分:0)

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