簡體   English   中英

android 4.4中的隧道接口(VpnService)不會在read()上阻塞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM