我有一个需要发送和接收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());
}
}
}