代码之家  ›  专栏  ›  技术社区  ›  Jack J

无法从android应用程序接收windows 10 UWP中的UDP广播

  •  1
  • Jack J  · 技术社区  · 8 年前
    • 我正在使用Xamarin.forms&.net标准2为共享代码编写UWP和Android应用程序。
    • 我在windows上安装了wireshark,它可以接收来自这两个应用的所有软件包。
    • 我为我的app.uwp.exe添加了防火墙规则(允许任何网络、任何端口、任何协议、任何ip),我重新启动了pc,但我的uwp应用仍然无法从android应用接收。

        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:192.168.1。
    11: 上午57:12:192.168.1.155
    11: 上午57:12:192.168.1。
    11: 上午57:13:192.168.1.155
    11: 上午57:13:192.168.1。
    ....
    注:192.168.1.100是Windows PC IP


    11: 上午57:11:192.168.1.100
    11: 上午57:12:192.168.1.100

    11: 上午57:14:192.168.1.100

    ....

    0 回复  |  直到 7 年前
        1
  •  1
  •   Gyle Iverson    6 年前

    要接收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;
        }
    

    在处理移动设备时,只需使用Wireless802 1广播地址。在笔记本电脑或工作站上,可能会变得稍微复杂一些。这些设备可以在每个接口上有多个网络接口和多个子网。因此,返回列表的原因。而且,这意味着您可能需要有多个UdpClient实例,每个子网一个。

    这对操作来说可能太晚了。希望这些信息能帮助其他一些疲惫不堪的搜索者尝试让广播正常工作(并且他们可以停止在桌子上敲打自己的前额)。