首页 文章

多个NIC未收到多播数据包

提问于
浏览
0

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

我有一台带有多个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 .

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

1 回答

  • 0

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

相关问题