C# 多个NIC未接收到多播数据包

C# 多个NIC未接收到多播数据包,c#,windows,udp,multicast,nic,C#,Windows,Udp,Multicast,Nic,我有一个问题,我似乎无法解决,在浏览了网站后,我没有看到我的确切问题,所以我们开始吧 我有一台带有多个NIC适配器的电脑。一个设置为192.168.6.1,另一个设置为192.168.2.90,两者都具有相同的子网掩码255.255.0.0。两个NIC都插入同一个网络交换机(不受管理,只是一个32端口交换机)。位于同一网络上的多台PC具有相同的子网掩码,但IP地址在192.168.6.X范围内不同(192.168.6.6、192.168.6.7等) 我有一个应用程序在PC上运行,带有多个NIC适

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

我有一台带有多个NIC适配器的电脑。一个设置为192.168.6.1,另一个设置为192.168.2.90,两者都具有相同的子网掩码255.255.0.0。两个NIC都插入同一个网络交换机(不受管理,只是一个32端口交换机)。位于同一网络上的多台PC具有相同的子网掩码,但IP地址在192.168.6.X范围内不同(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


有什么线索吗?考虑到它是一个公共网络,使用一个NIC让我的应用程序接收数据包而另一个不接收数据包的原因是什么

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

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

receiveUDPClient = new UdpClient(localIPEndPoint);
实际情况是,当您使用该客户端加入多播地址时,操作系统不会强制IGMP消息离开该端点。要强制IGMP退出您想要的端点,您需要使用双参数方法加入多播地址,其中第二个IP地址是您想要监听的本地enpoint只需使用下面的行,而不是单参数JoinMulticastGroup方法:

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

我希望这不是必需的,因为所有JoinMulticastGroup方法都使用当前绑定的端点作为默认本地端点是有意义的,但它不是这样工作的。

您能详细说明通过每个可用接口加入多播组的意思吗?在上面的示例中,这些行不是在指定要侦听多播的NIC适配器吗:
localIPEndPoint=new-IPEndPoint(IPAddress.Parse(“192.168.6.1”),16466;receiveUDPClient=新的UdpClient(localIPEndPoint);receiveUDPClient.JoinMulticastGroup(IPAddress.Parse(“239.254.2.1”)我注意到JoinMulticastGroup有一个重载来指定一个本地地址,我应该将我要侦听的NIC适配器IP地址放在哪里?我还想了解更多信息。我面临着完全相同的问题,禁用NIC不是一个选项