簡體   English   中英

無法從Android應用程序在Windows 10 UWP中接收UDP廣播

[英]can't receive UDP broadcast in windows 10 UWP from android app

  • 我正在使用Xamarin.forms和.net Standard 2編寫共享代碼的UWP和Android應用程序。
  • 我正在嘗試從兩個應用程序發送和接收UPD廣播,但是問題是我只能按預期從android應用程序發送和接收,而UWP應用程序無法接收UDP廣播數據包?
  • 我在Windows上安裝了Wireshark,它可以接收來自這兩個應用程序的所有軟件包。
  • 我為我的app.uwp.exe添加了防火牆規則(允許任何網絡,任何端口,任何協議,任何IP),重新啟動計算機后,仍然無法從android應用接收UWP應用。

代碼:

    using System.Threading.Tasks;
    using Xamarin.Forms;
    using Xamarin.Forms.Xaml;
    using System.Net.Sockets;
    using System.Net;    

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ItemsPage : ContentPage
    {
     public async static Task<String> UDP_receive()
     {
        var myUDP = new UdpClient(8888);
        myUDP.EnableBroadcast = true;            
        var myResult = await myUDP.ReceiveAsync();
        myUDP.Close();
        return Encoding.ASCII.GetString(myResult.Buffer) + " : " + myResult.RemoteEndPoint.Address.ToString();
     }

     public async static Task UDP_Send()
     {
        var myUDP = new UdpClient();
        var RequestData = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
        myUDP.EnableBroadcast = true;
        await myUDP.SendAsync(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888));
        myUDP.Close();
     }
    void Button1_click(object sender, EventArgs e)
     {
        StartListen();
        StartSending();   
     }
     async Task StartListen()
     {
        Exception eXX = null;
        while (eXX == null)
        {
            try
            {
                myText.Text += Environment.NewLine + await UDP_receive();
            }
            catch (Exception ex2)
            {
                eXX = ex2;
                log(ex2);
            }
        }
     }

     async Task StartSending()
     {
        Exception eXX = null;
        while (eXX == null)
        {
            try
            {
                await MyData.UDP_Send();
                await Task.Delay(1000);
            }
            catch (Exception ex2)
            {
                eXX = ex2;
                log(ex2);
            }
        }
     } 
   }    

Android輸出:
11:57:11 AM:192.168.1.155
11:57:11 AM:192.168.1。 100
11:57:12 AM:192.168.1.155
11:57:12 AM:192.168.1。 100
11:57:13 AM:192.168.1.155
11:57:13 AM:192.168.1。 100
....
注意:192.168.1.100是Windows PC IP

UWP輸出:
11:57:11 AM:192.168.1.100
11:57:12 AM:192.168.1.100
11:57:13 AM:192.168.1.100
11:57:14 AM:192.168.1.100
11:57:15 AM:192.168.1.100
....

要接收UDP廣播,請嘗試將創建與綁定分開。 例如,

            var myUDP = new UdpClient()
            {
                ExclusiveAddressUse = false,
                EnableBroadcast = true
            };

            IPEndPoint localIPEndPoint = new IPEndPoint(myIP.BroadcastIPAddress, 8888);
            myUDP.Client.Bind(localIPEndPoint);

根據我的經驗,看起來像UdpClient(8888)這樣的短格式構造函數過早地綁定了底層套接字。 這樣可以防止更改EnableBroadcast屬性。

同樣,從平台到平台,我發現接收廣播的唯一可靠方法是使用子網的實際廣播地址。 捕獲信息的陷阱很容易完成(?),如下所示。

    public class BroadcastAddress
    {
        public IPAddress IPAddress { get; set; }
        public IPAddress BroadcastIPAddress { get; set; }
        public NetworkInterfaceType NetworkInterfaceType { get; set; }
    }

    public static IEnumerable<BroadcastAddress> GetBroadcastAddresses()
    {
        List<BroadcastAddress> broadcastAddresses = new List<BroadcastAddress>();

        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface networkInterface in networkInterfaces)
        {
            if (networkInterface != null 
                && (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211
                ||  networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet))
            {
                IPInterfaceProperties iPInterfaceProperties = networkInterface.GetIPProperties();
                UnicastIPAddressInformationCollection unicastIPAddressInformationCollection = iPInterfaceProperties.UnicastAddresses;
                foreach (UnicastIPAddressInformation unicastIPAddressInformation in unicastIPAddressInformationCollection)
                {
                    if (unicastIPAddressInformation.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        IPAddress broadcastIPAddress = 
                            new IPAddress(unicastIPAddressInformation.Address.Address | (UInt32.MaxValue ^ (UInt32)(unicastIPAddressInformation.IPv4Mask.Address)));

                        broadcastAddresses.Add(new BroadcastAddress()
                        {
                            IPAddress = unicastIPAddressInformation.Address,
                            BroadcastIPAddress = broadcastIPAddress,
                            NetworkInterfaceType = networkInterface.NetworkInterfaceType
                        });
                    }
                }
            }
        }

        return broadcastAddresses;
    }

與移動設備打交道時,只需使用Wireless80211廣播地址即可。 在筆記本電腦或工作站上,它可能變得稍微復雜一些。 這些設備可以具有多個網絡接口以及每個接口上的多個子網。 因此,返回列表的原因。 並且,這意味着您可能需要具有多個UdpClient實例,每個子網一個。

對於OP來說可能為時已晚。 希望這些信息可以幫助其他疲倦的搜索者嘗試使廣播正常工作(並且他們可以停止在桌子上敲打額頭)。

暫無
暫無

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

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