我正在探索
Android VpnService的功能.目前,我已经通过在用户空间中重建IP堆栈来构建了一个非常基本的请求转发器:我从VpnService的输入流中读取IP数据包,解析它们,并且为了不想转发的连接,我尝试重新创建VPN连接外的套接字连接.
我已经明白,最后一点由VpnService.protect()方便,并尝试实现如下:
Socket socket = new Socket(); vpnService.protect(socket); socket.connect(new InetSocketAddress( header.getDestinationAddress(),// From my IP datagram header body.getDestinationPort())); // From the TCP datagram header
不幸的是,这种方法导致了VPN接口的环回.
而上面的代码将简单地阻止并最终超时,我通过从单独的线程调用Socket.connect(InetSocketAddress)来观察环回.该连接直接返回到我的VpnService的输入流中,该过程重复.
不用说,这会导致循环.我得到这样的感觉,原因是在创建套接字时(随后调用VpnService.protect(Socket)),我还没有设置目标IP&港口
这似乎确实是这样,因为在我的VpnService实现中覆盖VpnService.protect(Socket)和VpnService.protect(int),并且在两种情况下调用supers都返回false.
如何正确保护套接字连接?