[英]tunnel interface (VpnService) in android 4.4 does not block on read()
我正在使用VpnService創建隧道接口。 接口創建正確。 我也可以在隧道接口上設置路由和MTU。 但是,當我在此接口上執行讀取操作時,讀取操作永遠不會阻塞,從而導致繁忙的等待和浪費的CPU周期。
這是我的代碼的運行循環,可以從隧道接口讀取:`public sync void run(){Log.v(TAG,“啟動針腳隧道線程”);
FileInputStream in = new FileInputStream(_tunnel_interface.getFileDescriptor());
byte[] pktBuf = new byte[1024];
while(true) {
try {
int length = in.read(pktBuf);
Log.v(TAG, "Got a packet of length"+Integer.toString(length));
if ( length == 0) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
Log.w(TAG, "Thread was interrupted:"+e.toString());
stopSelf();
return;
}
}
} catch (IOException e) {
Log.w(TAG, "Stitch tunnel interface close unexpectedly:"+ e.toString());
stopSelf();
return;
}
}
}`
我檢查了ToyVPN示例,似乎即使在該代碼中也不希望在調用隧道接口上的read時阻塞。
這是錯誤嗎? 根據用於在fileinputstream上讀取的JAVA規范,僅當傳遞的緩沖區的長度為零時,read調用才應返回0字節。 顯然這里不是這種情況。 所以有點與我觀察到的行為混淆。
從VpnService.Builder establish
方法文檔 :
“默認情況下,文件描述符被置於非阻塞模式,以避免阻塞Java線程。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.