Android VpnService:从Tun设备读取挂起

时间:2014-04-21 17:26:10

标签: android interceptor traffic tun

我的应用正在使用VpnService进行流量拦截。

它的作用:
1.在循环中从Tun设备读取:

while (started && tunDevice.valid()) {
    final byte[] bytes = tunDevice.read();
    IpPacket packet = PacketFactory.createPacket(bytes);
    if (packet == null) {
        Thread.yield();
    } else {
        proxyService.handlePacket(packet);
    }
}

TunDevice.read:

@Override
public byte[] read() throws IOException {
    if (!valid()) {
        LOG.warn("TUN: file descriptor is not valid any more");
        return null;
    }

    int length = tunInputStream.read(readBuffer);
    LOG.debug("TUN: Received packet length={}", length);
    if (length < 0) {
        throw new IOException("Tun device is closed");
    }
    if (length == 0) {
        return null;
    }
    return Arrays.copyOfRange(readBuffer, 0, length);
}

2.将数据提交到受保护的套接字。

问题是一段时间后它停止从TUN设备读取。 读取方法只是挂起并等待一段时间(如3-5分钟)。

使用netstat我看到所有新连接都处于SYN_SENT状态,我可以理解为什么 - 他们无法从我的代码接收ACK,因为我无法接收这些SYN数据包。

问题是:它可能是什么?当TUN设备可以这样做?

1 个答案:

答案 0 :(得分:0)

在我们的案例中,问题出在我们的TCP实施中。 我们编写了比TCP更多的数据(广告窗口)。