UDP多播问题疑难解答

时间:2014-03-19 11:23:21

标签: c# sockets udp multicast udpclient

我正在尝试将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

欢迎任何调试的想法。

1 个答案:

答案 0 :(得分:0)

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

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

这是修订后的代码:

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();
}