C# UDP多播问题的疑难解答

C# UDP多播问题的疑难解答,c#,sockets,udp,multicast,udpclient,C#,Sockets,Udp,Multicast,Udpclient,我正在尝试将UDP数据报广播到本地网络上的多播地址。 除了一台特定的机器之外,这在几十台机器上都能很好地工作。 此特定机器能够从多播地址接收数据报,但不能发送消息 这是我正在使用的代码: using (UdpClient client = new UdpClient()) { client.Send(bytes, bytes.Length, remoteEP); client.Client.Shutdown(SocketShutdown.Both); client.Cli

我正在尝试将UDP数据报广播到本地网络上的多播地址。 除了一台特定的机器之外,这在几十台机器上都能很好地工作。
此特定机器能够从多播地址接收数据报,但不能发送消息

这是我正在使用的代码:

using (UdpClient client = new UdpClient())
{
    client.Send(bytes, bytes.Length, remoteEP);
    client.Client.Shutdown(SocketShutdown.Both);
    client.Client.Close();
}
其中,
remoteEP
是多播组的IP地址和端口,
bytes
是有效数据

  • 没有引发异常,消息根本没有传递
  • 消息在同一台机器上的环回中从
    127.0.0.1
    接收
  • 消息在Wireshark传出流量中未显示
  • 该计算机是网络中唯一运行Windows 8的计算机
  • Windows防火墙已禁用
  • 该计算机与侦听计算机位于同一子网中
  • 此计算机上只有一个活动的网络接口
  • 我试过:
    • client.BroadcastEnabled=true
    • 在客户端加入多播组
    • 使用
      BeginSend
      而不是
      Send

任何关于调试的想法都是欢迎的。

具有讽刺意味的是,在搜索了一整天的解决方案后,我在发布了一个SO问题2分钟后发现了它

文章中的方法有所帮助。我猜有一些我不知道的网络接口

这是修订后的守则:

using (UdpClient client = new UdpClient())
{
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
    foreach (NetworkInterface adapter in nics)
    {
        IPInterfaceProperties ip_properties = adapter.GetIPProperties();
        if (adapter.GetIPProperties().MulticastAddresses.Count == 0)
            continue; // most of VPN adapters will be skipped
        if (!adapter.SupportsMulticast)
            continue; // multicast is meaningless for this type of connection
        if (OperationalStatus.Up != adapter.OperationalStatus)
            continue; // this adapter is off or not connected
        IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties();
        if (null == p)
            continue; // IPv4 is not configured on this adapter
        client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index));
        break;
    }

    client.Send(bytes, bytes.Length, remoteEP);
    client.Client.Shutdown(SocketShutdown.Both);
    client.Client.Close();
}