13

我正在尝试在我的本地网络上进行一些简单的 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地址(即不是多播),它就可以工作。

任何帮助,将不胜感激。

4

3 回答 3

8

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

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

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

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

于 2009-04-20T09:53:03.240 回答
4

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

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

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

于 2013-05-31T11:03:34.870 回答
0

我在代码中的任何地方都看不到指定的TTL 。请记住,TTL 最初的意思是单位秒,但现在变成了单位跃点。这意味着通过使用巧妙的 TTL,您可以避免通过路由器。我机器上的默认 TTL 是 32 - 我认为这应该绰绰有余;但如果您的系统经历了任何形式的安全锁定,您的实际上可能会有所不同(UdpClient.Ttl)。

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

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

总而言之,使用 Sockets 而不是 UdpClients 似乎取得了成功。

您选择的多播组也可以是仅限本地的。尝试另一个。

您的物理网络层也可能导致问题。我会冒险质疑开关和直接(x-over)连接。集线器和所有更智能的应该可以很好地处理它们。然而,我没有任何文献支持这一点。

于 2009-04-20T07:37:23.457 回答