gpt4 book ai didi

Java NIO FileChannel - 从 Android TUN 网络接口(interface)读取空值

转载 作者:行者123 更新时间:2023-12-01 16:42:38 26 4
gpt4 key购买 nike

上下文:我最近开始在我的项目中使用 java.nio,该项目利用了 Android 的 VpnService。在我的实现中,我将 VpnServicebuilt() 方法返回的 FileDescriptor 包装到 java.io.FileDescriptor 中。 nio.FileChannel 如下所示。

private val outboundNetworkChannel = FileInputStream(fd).channel

之后,我有一个 kotlin 协程,它无限期地从 FileChannel 读取并处理出站 IPv4/IPv6 数据包。

问题:下面提到的代码 fragment 有效,但我看到 FileChannel 发生了很多空读取,而 FileChannel 又旋转了 while不必要的循环。

fun reader() = scope.launch(handler) {
while (isActive) {
val pkt = read()
if(pkt !== DUMMY){
// Send the read IPv4/IPv6 packet for processing
}
}
}

private suspend fun read(): IPDatagram =
withContext(Dispatchers.IO) {
val bytes = ByteBufferPool.acquire()
outboundChannel.read(bytes) // Returns a lot of empty reads with return value as 0
return@withContext marshal(bytes) // Read IPv4/IPv6 headers and wrap the packet
}

我正在寻找的内容:事实上,我知道 FileChannel 是一个阻塞 channel ,在这种情况下,由于该 channel 由网络接口(interface)​​支持,它可能没有准备好读取的数据包。是否有更好的方法,使用/不使用 FileChannel 可以实现更高效的实现,而不浪费宝贵的 CPU 周期?我也乐于接受新想法:)

最佳答案

在深入研究 VpnService 的 Android 文档后,我设法弄清楚了这一点。默认情况下,当使用 VpnService.Builder 建立 VPN 连接时,fd 处于非阻塞模式。从 API 级别 21 开始,可以setBlocking(true)

public VpnService.Builder setBlocking( boolean 阻塞)的文档中所述

Sets the VPN interface's file descriptor to be in blocking/non-blocking mode. By default, the file descriptor returned by establish() is non-blocking.

关于Java NIO FileChannel - 从 Android TUN 网络接口(interface)读取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61834038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com