我的应用正在使用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设备可以这样做?
答案 0 :(得分:0)
在我们的案例中,问题出在我们的TCP实施中。 我们编写了比TCP更多的数据(广告窗口)。