【问题标题】:UDP Broadcast on Android EmulatorAndroid 模拟器上的 UDP 广播
【发布时间】: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


【解决方案1】:

似乎至少在Android模拟器上使用“10.0.2.2”地址是正确的路径。 “IPAddress.Broadcast”常量的使用仅适用于物理设备。在模拟器上,无法发送标准广播消息。这是因为 Android 模拟器有一个特殊的网络配置才能工作。创建了一个专用网络,并且该网络可能没有将广播消息重定向到主机网络。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2014-02-12
    • 2017-12-24
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多