代码之家  ›  专栏  ›  技术社区  ›  Simon Randy Burden

如何在C中跨本地网络进行UDP多播?

  •  9
  • Simon Randy Burden  · 技术社区  · 16 年前

    我正在尝试在本地网络上进行一些简单的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();
            }
        }
    

    这是我的接收码

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

    它在我的本地机器上工作得很好,但不能跨网络工作。

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

    -如果我直接发送到客户机的硬编码IP地址(即不是多播),它就会工作。

    任何帮助都将不胜感激。

    3 回复  |  直到 11 年前
        1
  •  7
  •   Alnitak    16 年前

    您的本地网络硬件支持吗 IGMP ?

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

    要测试这一点,请使用交叉电缆将两台机器直接连接在一起。这应该总是有效的。

    而且,应该是 服务器 将TTL参数提供给的代码的一半 JoinMulticastGroup() 不是客户的一半。

        2
  •  2
  •   Uri Maimon - Nominal    11 年前

    我刚刚花了4个小时在类似的事情上(我想),我的解决方案是:

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

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

        3
  •  0
  •   Jonathan C Dickinson    16 年前

    我看不见 TTL 在代码中的任何位置指定。记住,TTL原本是以单位秒为单位的,但现在已经变成了单位跳。这意味着,通过使用一个巧妙的TTL,您可以消除通过路由器的情况。我的机器上的默认TTL是32-我认为这应该足够了;但是如果您的系统已经通过了任何形式的安全锁定,那么您的系统实际上可能是不同的(udpclient.ttl)。

    我不能推荐你需要的TTL——因为我个人需要做很多实验。

    如果这不起作用,您可以看看这些文章:

    总之,看起来使用套接字而不是UDPClient已经成功了。

    您选择的多播组也只能是本地的。 Try another one.

    您的物理网络层也可能导致问题。我冒昧地询问交换机和直接(X-over)连接。集线器和所有更智能的应该处理好它们。不过,我没有任何文献支持这一点。