Android为什么不接收Android 8.1及更高版本的UDP消息

时间:2019-05-20 12:27:16

标签: android xamarin.android

我有一个需要发送和接收UDP消息的应用程序。流程是:

  • 本地系统从随机分配的本地端口(例如50001)向侦听预定义端口号(例如6000)的系统发送UDP广播。

  • 正在侦听6000的远程系统(将永远只有一个进行答复的系统)读取消息并检查地址和端口,并在用于发送消息的同一端口上以UDP单播消息进行答复(在这种情况下为50001)。

该应用程序适用于早期的Android版本,但不适用于8.1或9。有人知道为什么吗?

我已经写了一些非常基本的代码来说明问题。当本地系统是Windows或运行Android 4.4、6或7版本的Android模拟器时,此代码有效(即,我可以发送广播并读取返回的UDP消息)。当我在版本8.1或更高版本的真实设备上运行模拟器时,它中断了。在以后的情况下,UDP广播消失了,远程系统读取并回复了正确的端口(通过Wireshark验证),但是UDP消息无法被Android系统读取。

在所有情况下,远程系统都是本地网络上的单独物理设备。

void runUDP()
        {
            UdpClient udpClient = new UdpClient();
            try
            {
                // Need to send and receive from the same port
                udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                udpClient.EnableBroadcast = true;

                // Bind to a port 
                udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, 0));

                // Broadcast dummy message to systems listening on port 6000
                udpClient.Send(new byte[] { 1, 2, 3, 4 }, 4, new IPEndPoint(IPAddress.Parse("192.168.3.255"),6000));

                //Prepare to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

                // Blocks until a message returns on this socket from a remote host. The remote host replies on the same port
                // that the local host used for broadcasting
                 byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);

                // Uses the IPEndPoint object to determine which of these two hosts responded.
                Console.WriteLine("This is the message you received " +
                                             returnData.ToString());
                Console.WriteLine("This message was sent from " +
                                            RemoteIpEndPoint.Address.ToString() +
                                            " on their port number " +
                                            RemoteIpEndPoint.Port.ToString());

                udpClient.Close();


            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }

0 个答案:

没有答案