我正在开发一个 Android 应用程序,它通过 WLAN 向 Windows 端点发送/接收大量 UDP 流量(不,我不能使用 TCP)。
问题是当我增加流量时,我开始看到在我调用 sendto(应用程序是用 NDK 编写的)和我看到数据包到达 Windows 端点之间存在巨大的延迟。在10 秒左右!反过来也会发生同样的事情:我看到 Windows 端点发送的数据包和 recvfrom() 接收的数据包之间存在巨大延迟。
- 更改 SO_SNDBUF 没有任何效果,所以我认为这不是应用程序级缓冲控制的问题。
- 我已经验证了该问题存在于各种 Android 设备上,因此我认为这不是硬件/无线驱动程序的问题
- 使用嗅探器并关联时间戳,我确认在调用 sendto() 和从 Android 设备发送的数据包之间发生延迟,因此在 AP 或 Windows 端点中没有发生缓冲
所以在这一点上,我几乎没有想法。事实会让我相信缓冲发生在 Android OS 层上,但是10 秒的 10Mbps 流量?对于内存占用如此大的问题的操作系统来说,这似乎太高了,不可行。
另外,如果问题是我发送数据的速度太快并且压倒了操作系统,那么我希望 sendto() 返回 ENOMEM 或 ENOBUFS ......但没有迹象表明 Android 应用程序级别有任何问题。
所以我的问题是:是什么导致了这种延迟?有没有办法减轻它,或者我是否需要改变我的应用程序以有更长的超时时间,或者在它变坏之前检测到这种情况?