android - Android 的巨大 UDP 延迟/滞后

标签 android sockets android-ndk udp wifi

我正在开发一个 Android 应用程序,它通过 WLAN 向 Windows 端点发送/接收大量 UDP 流量(不,我不能使用 TCP)。

问题是,当我增加流量时,我开始看到调用 sendto(应用程序是用 NDK 编写的)和我看到数据包到达 Windows 端点之间的巨大延迟。在 10 秒 附近!同样的事情也反过来发生:我看到 Windows 端点发送的数据包与 recvfrom() 接收的数据包之间存在巨大的延迟。

  • 更改 SO_SNDBUF 没有任何效果,因此我认为这不是应用程序级缓冲控制的问题。
  • 我已确认该问题存在于各种 Android 设备上,因此我认为这不是硬件/无线驱动程序的问题
  • 使用嗅探器并关联时间戳,我确认在调用 sendto() 和从 Android 设备发送数据包之间发生了延迟,因此 AP 或 Windows 端点中没有发生缓冲

所以在这一点上我几乎没有想法。事实会让我相信缓冲发生在 Android 操作系统层上,但是 10 秒的 10Mbps 流量?对于一个内存占用如此巨大的操作系统来说,这似乎太高了,不可行。

另外,如果问题是我发送数据的速度太快导致操作系统不堪重负,那么我希望 sendto() 返回 ENOMEM 或 ENOBUFS...但是没有迹象表明 Android 应用程序有任何问题水平。

所以我的问题是:造成这种延迟的原因是什么?有没有办法减轻它,或者我是否需要更改我的应用程序以具有更长的超时时间或某种方式在它变得糟糕之前检测到这种情况?

最佳答案

你发送的太多了..你发送了多少? 10Mbps 绝对是太高了。请记住:

  1. 您发送的每个 UDP 数据报都有一个额外的 28 字节报头(UDP + IP over IPv4)
  2. 连接速度是您永远无法达到的理论上的最大限制
  3. Phone OS 可能会限制您,Phone OS 需要节省电池电量并尽量减少套接字通信来做到这一点。

您说您的 CPU 使用率是 20%,您有多少个核心 - 您可能会最大化执行发送的核心,即处理速度是瓶颈。

关于android - Android 的巨大 UDP 延迟/滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646396/

相关文章:

android - 如何在安装文件夹外的 xamarin pcl uwp 中显示 pdf 文件?

android - 尝试使用 NDK 为 Android 构建 PocketSphinx 时出现问题

Android ndk-build 选项用于删除符号表信息

android In-App Purchase API 3消费测试购买

android - 来自 google direction API 的 JSON 解析

android - 如果我已经为我的应用程序提供了 Android 许可,我是否应该对我的应用程序进行复制保护?

java - Java套接字无法发送两个字节数组

c++ - Recv() 上的连接被拒绝,而发送似乎工作正常

c++ - select() 用于 UDP 连接

android - 如何在 Android NDK 中使用 pthreads?