C# UdpClient不';无法在连接时接收多播流量

C# UdpClient不';无法在连接时接收多播流量,c#,windows,udp,multicast,C#,Windows,Udp,Multicast,我正在使用UdpClient来接收和发送多播流量,但当应用程序启动并运行时,新的网络接口开始运行时,我遇到了一个问题 UdpClient是在我的应用程序中创建的,当接口开始运行时(插入式网络电缆上升),它绑定到接口的静态IP,并且预期的IGMP数据包在该接口上的wireshark中可见,但UdpClient实例从不报告有任何可用数据 如果在连接电缆之前创建UdpClient,则也会出现此问题 我已尝试设置SocketOptionName.multicasterface,但这应该只涉及发送多播流量

我正在使用
UdpClient
来接收和发送多播流量,但当应用程序启动并运行时,新的网络接口开始运行时,我遇到了一个问题

UdpClient
是在我的应用程序中创建的,当接口开始运行时(插入式网络电缆上升),它绑定到接口的静态IP,并且预期的IGMP数据包在该接口上的wireshark中可见,但
UdpClient
实例从不报告有任何可用数据

如果在连接电缆之前创建
UdpClient
,则也会出现此问题

我已尝试设置
SocketOptionName.multicasterface
,但这应该只涉及发送多播流量,而不是接收。。。这方面的例子如下:

下面是一个显示此问题的控制台应用程序。当此应用程序运行时,我连接以太网电缆,Wireshark显示来自此应用程序的IGMP加入组数据包,以及来自另一台计算机的传入多播流量。如果我已经插上电缆并启动应用程序,它将接收我期望的所有流量

class Program
{
    static UdpClient udpClient;

    static IPAddress bindAddress = IPAddress.Parse("192.168.101.220");
    static IPAddress groupListenAddress = IPAddress.Parse("239.255.0.1");
    static int port = 9999;

    static bool shouldRun = true;
    static Thread thread;

    static void Main(string[] args)
    {
        udpClient = new UdpClient();
        udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);

        IPEndPoint localEndPoint = new IPEndPoint(bindAddress, port);
        udpClient.Client.Bind(localEndPoint);

        udpClient.JoinMulticastGroup(groupListenAddress);

        thread = new Thread(runThread);
        thread.Start();

        Console.WriteLine("Press Enter to exit.");
        Console.ReadLine();

        shouldRun = false;
        thread.Join(100);
    }

    private static void runThread(object obj)
    {
        while (shouldRun)
        {
            if (udpClient.Available > 0)
            {
                IPEndPoint endPoint = null;
                byte[] buffer = udpClient.Receive(ref endPoint);
                Console.WriteLine("Received Message from: {0} Length: {1}", endPoint, buffer.Length);
            }
            Thread.Sleep(10);
        }

    }
}

请注意,IGMP消息由主机操作系统发送,而不是由应用程序发送。如果操作系统第一次看到多播地址的连接,它将发送IGMP消息。如果另一个进程也希望加入相同的地址,则可能发送或不发送新的IGMP消息

此外,各种网络组件(特别是路由器,还有电力线适配器)都使用IGMP窥探来确定向何处发送多播流量,而且它们经常出错。IGMP有两个不兼容的版本,有些设备只支持一个版本,有些设备以奇怪的方式在版本之间进行转换。这是一个大混乱

让这一切变得非常可怕的是,大多数设备,包括本地主机操作系统,都有一种依赖于时间的行为。这使得分析问题变得非常困难,因为你永远无法得出确切的结论,因为目前它可能只是碰巧起作用


bind()独立于IGMP语句会混淆UDP。在Linux上,绑定到IP地址将过滤所有传入的UDP数据包,并且您将只接收到此特定IP地址的数据包。要在Linux上接收多播通信,您通常必须绑定到0.0.0.0。但我假设您使用的是Windows,其中绑定到本地适配器的IP地址是正确的ing。然后,您将收到到该适配器的Multilcast流量。

我理解的正确吗?您有一个静态IP为192.168.101.220的网络接口。然后在应用程序运行时插入电缆。是的,这是正确的。应用程序已在运行,然后插入网络电缆。IGMP包然后发送ts,但UdpClient从不接收任何数据。如果您在连接电缆后运行应用程序,则会接收数据。我不是多播或类似的专家,但您的应用程序在联机时不必“加入”新接口网络的多播组吗?没错,JoinMulticastGroup方法sends是一个IGMP数据包-在这种情况下,它在网络上线之前不会发送它-但一旦连接,我肯定会在Wireshark中看到它。我做了一点测试设置,在我的pc上看不到IGMP数据包(运行上面的代码)。但我明天会再试一次(希望使用正确的IP筛选器:)。我正在使用Windows,但在这种情况下我没有收到多播流量。有趣的是,为什么多播很难正确进行,我没有意识到这一点。谢谢!