如何在c#中通过本地网络进行UDP组播?

Sim*_*mon 11 .net c# messaging networking

我试图在我的本地网络上进行一些简单的UDP通信.

我想要做的就是对网络上的所有机器进行多播

这是我的发送代码

    public void SendMessage(string message)
    {
        var data = Encoding.Default.GetBytes(message);
        using (var udpClient = new UdpClient(AddressFamily.InterNetwork))
        {
            var address = IPAddress.Parse("224.100.0.1");
            var ipEndPoint = new IPEndPoint(address, 8088);
            udpClient.JoinMulticastGroup(address);
            udpClient.Send(data, data.Length, ipEndPoint);
            udpClient.Close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的接收代码

    public void Start()
    {
        udpClient = new UdpClient(8088);
        udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);

        receiveThread = new Thread(Receive);
        receiveThread.Start();
    }

    public void Receive()
    {
        while (true)
        {
            var ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
            var data = udpClient.Receive(ref ipEndPoint);

            Message = Encoding.Default.GetString(data);

            // Raise the AfterReceive event
            if (AfterReceive != null)
            {
                AfterReceive(this, new EventArgs());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它在我的本地计算机上运行良好,但不能通过网络运行.

- 似乎不是防火墙.我在两台机器上都禁用了它,但它仍然无效.

- 如果我直接发送到客户端机器的硬编码IP地址(即不是多播),它可以工作.

任何帮助,将不胜感激.

Aln*_*tak 8

您的本地网络硬件是否支持IGMP

您的交换机可能是多播感知的,但如果IGMP被禁用,它将不会注意到任何连接的硬件是否订阅了特定的多播组,因此它不会转发这些数据包.

要对此进行测试,请使用交叉电缆将两台机器直接连接在一起.应该(AFAICR)始终有效.

此外,它应该是提供TTL参数的代码的服务器的一半JoinMulticastGroup(),而不是客户端的一半.


Uri*_*nal 5

我刚刚花了 4 个小时做类似的事情(我认为),对我来说解决方案是:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;
Run Code Online (Sandbox Code Playgroud)

在多播组上使用特定(第一个外部)IP 地址。

  • 什么是“IP”?我没有看到其他人在这个问题中提到名为“IP”的变量,因此您的变量名称非常混乱,并且似乎缺少一些上下文。 (3认同)
  • 我也无法让它在 LAN 上工作。调用 JoinMulticastGroup() 时,如果没有要监听的显式 IP 地址的第二个参数,它只是任意选择我作为 Docker/Hyper-V 的一部分安装的一些虚拟以太网驱动程序,并将其加入多播组而不是我的真实以太网适配器。如果您有多个网络适配器,您需要使用将 IP 地址作为第二个参数的方法重载来显式指定要加入多播组的 IP 地址。 (2认同)