【发布时间】:2017-12-19 22:26:03
【问题描述】:
我正在使用 Xamarin 开发一个 Android 应用程序。此应用程序在特定端口上发送 UDP 广播,由同一网络上的设备接收,然后设备将一些数据回复给应用程序。可以有多个设备,因此应用会一直读取 UDP 响应,直到超时。
目前的设备是在主机上运行的一个简单的 c# windows forms 应用程序,该应用程序运行在 android 模拟器上。
问题是主机(也不是设备应用程序)在端口上接收到任何数据包。
这是在 Android 应用上发送广播的代码:
public async Task SendBroadcast()
{
UdpClient c = new UdpClient();
c.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
c.EnableBroadcast = true;
string msg = "...device_key...";
await c.SendAsync(Encoding.ASCII.GetBytes(msg), msg.Length, new IPEndPoint(IPAddress.Broadcast, 55566));
}
如果我将IPAddress.Broadcast 更改为使用主机地址10.0.2.2,它将按预期工作。
任何想法如何让广播数据包到达本地网络?
【问题讨论】:
-
您是否在接收客户端上使用
IPAddress.Any? -
是的,接收客户端使用
IPEndPoint(IPAddress.Any, 55566)。 -
这是对广播的滥用。只有当您需要中断 LAN 上的每个主机时,才应使用广播,因为它就是这样做的。如果知道 IP 地址,则使用单播,否则可以使用多播。 IPv6 对 IPv4 的改进之一是消除了广播。许多公司甚至不会考虑滥用广播的应用程序,因为它会阻塞网络并中断每个主机,即使主机对广播数据包不感兴趣。
-
我也有同样的问题!我认为这是由于模拟器的特殊网络,它做了一些神奇的工作,如转发,在主机服务器中,接收到的数据包显示它的地址是 127.0.0.1 而不是 10.0.2.15,它们是两个不同的子网,无法通过广播
标签: c# networking xamarin android-emulator