簡體   English   中英

如何在c#中通過本地網絡進行UDP組播?

[英]How to do a UDP multicast across the local network in c#?

我試圖在我的本地網絡上進行一些簡單的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地址(即不是多播),它可以工作。

任何幫助,將不勝感激。

您的本地網絡硬件是否支持IGMP

您的交換機可能是多播感知的,但如果IGMP被禁用,它將不會注意到任何連接的硬件是否訂閱了特定的多播組,因此它不會轉發這些數據包。

要對此進行測試,請使用交叉電纜將兩台機器直接連接在一起。 應該(AFAICR)始終有效。

此外,它應該是服務器的一半,其中TTL參數提供給JoinMulticastGroup() ,而不是客戶端的一半。

我剛剛在類似的東西上花了4個小時(我想),我的解決方案是:

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

使用組播組上的特定(第一個外部)IP地址。

我看不到代碼中任何地方指定的TTL 請記住,TTL原本是以單位秒為單位,但已成為單位跳躍。 這意味着通過使用聰明的TTL,您可以消除通過路由器。 我的機器上的默認TTL是32 - 我認為這應該是足夠的; 但是如果您的系統已經通過任何形式的安全鎖定,那么您的實際可能會有所不同(UdpClient.Ttl)。

我不能推薦你需要的TTL - 因為我個人需要做很多實驗。

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

總而言之,看起來使用套接字而不是UdpClients取得了成功。

您選擇的多播組也可以是僅本地的。 嘗試另一個。

您的物理網絡層也可能導致問題。 我冒昧地質疑開關和直接(x-over)連接。 集線器和所有更智能的應該處理它們。 但是,我沒有任何文獻可以支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM