我正在从ToyVpn项目中查看VpnService.java。
我最初在run方法中看到以下几行
// Create a DatagramChannel as the VPN tunnel.
tunnel = DatagramChannel.open();
// Protect the tunnel before connecting to avoid loopback.
if (!protect(tunnel.socket())) {
throw new IllegalStateException("Cannot protect the tunnel");
}
据我所知,第一行创建了一个数据报/ UDP通道来连接远程服务器。但我不明白“保护”方法到底在做什么。
有人可以向我解释尽可能多的技术细节。谢谢。
答案 0 :(得分:1)
这是来自android.net.VpnService library的函数,该函数在ToyVpnService.java类中导入,如the source code中所示
您可以找到它的作用here
public boolean protect(int socket)
在API级别14中添加
保护套接字免受VPN连接的影响。后 保护,通过此套接字发送的数据将直接发送到 底层网络,因此其流量不会通过转发 VPN。如果需要将某些连接保留在外部,则此方法很有用 的VPN。例如,VPN隧道应该保护自己 目的地由VPN路由覆盖。否则它的传出包 将被发送回VPN接口并导致无限循环。 如果应用程序未准备好,则此方法将失败 撤销。
此方法未关闭套接字。
成功时返回true。