多个NIC未收到多播数据包

时间:2017-05-26 17:31:48

标签: c# windows udp multicast nic

我遇到的问题似乎无法解决,在浏览网站后我没有看到我的确切问题所以我们就去了。

我有一台带有多个NIC适配器的PC。一个设置为192.168.6.1,另一个设置为192.168.2.90,两者都具有相同的子网掩码255.255.0.0。两个NIC都插入同一个网络交换机(不管理,只有32端口交换机)。驻留在同一网络上的是具有相同子网掩码但在192.168.6.X范围内不同IP地址的多台PC(192.168.6.6,192.168.6.7等)

我在PC上运行了一个带有多个NIC适配器的应用程序,它正在绑定并加入多播组以接收数据包。我遇到的问题是我的应用程序没有收到从系统中的一台PC发送的多播数据包(即192.168.6.6)。在查看NIC的流量时,我可以在Wireshark中看到多播数据包,因此我相信每个NIC都正确地获取数据包。

一个小片段:

{
    IPEndPoint localIPEndPoint
    localIPEndPoint = new IPEndPoint(IPAddress.Parse("192.168.6.1"), 16466);
    receiveUDPClient = new UdpClient(localIPEndPoint);

    receiveUDPClient.JoinMulticastGroup(IPAddress.Parse("239.254.2.1"));
    receiveUDPClient.MulticastLoopback = false;
    receiveUDPClient.DontFragment = true;
    receiveUDPClient.Client.ReceiveBufferSize = 16384;

    // ....
    // ....

    BeginReceiveAudio();
}

public void BeginReceiveAudio()
{
    receiveUDPClient.BeginReceive(ReceiveCallback, receiveUDPClient);
}

我正在处理回调中的数据包,我知道在使用单个NIC时工作正常 - 事实上,如果我只是禁用192.168.2.90 NIC适配器,我的应用程序接收数据包就好了。

private void ReceiveCallback(IAsyncResult ar)
{
    byte[] receivedBytes = receiveUDPClient.EndReceive(ar, ref localIPEndPoint);

    // Process Data...

    BeginReceiveAudio();
}

另一个有趣的事情是,如果我在启用时交换适配器的IP地址,我的应用程序就会收到数据包就好了!我根本不熟悉数据包如何路由到每个NIC;我假设当你绑定到一个IP地址并加入一个组播组时,PC收到的任何传输到该组播组的数据包都被路由到属于该组播组的每个网卡。

有什么线索在这里发生?鉴于它是一个常见的网络,使用一个NIC让我的应用程序接收数据包但另一个不接收的原因是什么?

2 个答案:

答案 0 :(得分:0)

您需要通过每个可用接口加入组播组,以便通过每个接口发送IGMP消息,以便所有这些网络上的主机知道存在组播成员。如果仅在未指定接口的情况下加入一次,则静态IP路由用于确定IGMP的发送位置,即只有一个网络。

答案 1 :(得分:0)

问题是您正在使用下面的行,并假设它足以使用正确的NIC

receiveUDPClient = new UdpClient(localIPEndPoint);

问题的现实是,当您使用该客户端加入多播地址时,操作系统不会强制IGMP消息离开该端点。要强制将IGMP移出所需的端点,您需要使用两个参数的方法来加入多播地址,其中第二个IP地址是您要侦听的本地地址。 只需使用下面的行代替单个参数JoinMulticastGroup方法:

receiveUDPClient.JoinMulticastGroup(IPAddress.Parse("239.254.2.1"), IPAddress.Parse("192.168.6.1"));

我希望这不是必需的,因为所有JoinMulticastGroup方法都可以将当前绑定的端点用作默认的localEndpoint,但这是行不通的。