多个网卡未收到组播数据包



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

我有一台带有多个网卡适配器的电脑。 一个设置为 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 等)

我有一个应用程序在具有多个 NIC 适配器的 PC 上运行,它正在绑定并加入多播组以接收数据包。 我遇到的问题是我的应用程序没有收到从系统中的一台 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。

知道这是怎么回事吗? 鉴于它是一个公共网络,使用一个 NIC 让我的应用程序接收数据包而另一个不接收数据包的原因是什么?

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

问题是您正在使用下面的行,并假设它足以使用正确的 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 是有意义的,但它不是那样工作的。

最新更新