コンテキスト:最近java.nio
、Android のVpnService
. 私の実装では、以下に示すように、 のメソッドFileDescriptor
によって返される を にラップしました。establish()
VpnService
java.nio.FileChannel
private val outboundNetworkChannel = FileInputStream(fd).channel
FileChannel
その後、無期限に読み取り、送信 IPv4 / IPv6 パケットを処理する kotlin コルーチンを作成しました。
問題:以下のスニペットは機能しますが、 から多くの空の読み取りが発生し、ループが不必要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
がブロッキング チャネルであることはわかっています。この場合、チャネルはネットワーク インターフェイスによってサポートされているため、読み取る準備ができているパケットがない可能性があります。FileChannel
貴重な CPU サイクルを無駄にすることなく、より効率的な実装につながるより良いアプローチがありますか? 私も新しいアイデアを受け入れています:)