Android VpnService写入数据包错误 - 没有可用的缓冲区空间

时间:2014-05-13 04:50:58

标签: java android sockets

我正在将UDP数据包写入Android中的VpnService实例,但我间歇性地得到如下错误:

java.io.IOException: write failed: ENOBUFS (No buffer space available)
at libcore.io.IoBridge.write(IoBridge.java:455)
at java.io.FileOutputStream.write(FileOutputStream.java:187)
at java.io.OutputStream.write(OutputStream.java:82)

只有一个DatagramSocket用于发送和接收数据包,所以我不认为我泄漏了内存。我还检查了我的堆使用情况,它保持稳定在10-12 MB。我没有通过传输的TCP数据包得到此错误。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我只是在自己的VPN实现中遇到了这个问题(open source,如果有人想要一个可行的示例)。

在我的情况下,这是因为我将大于预期的TCP数据包写回到VPN接口,因为我的代码未正确处理最大段大小。

这不是由于某些通用缓冲区等待刷新,因此对于接收应用程序而言太大的数据包将永远因ENOBUFS而失败。

尽管我找不到任何地方的文档,但我希望这通常是原因:如果您尝试向VPN写任何单独大于VPN预期的数据包,就会遇到ENOBUFS。