gpt4 book ai didi

android - 保护 VpnService 中的套接字

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:57:13 27 4
gpt4 key购买 nike

我正在探索 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 接口(interface)。

虽然上面的代码会简单地阻塞并最终超时,但我通过从一个单独的线程调用 Socket.connect(InetSocketAddress) 来观察环回;连接直接回到我的 VpnService 的输入流,然后重复该过程。

不用说,这会导致循环。我感觉这是因为在创建套接字时(以及随后调用 VpnService.protect(Socket)),我还没有设置目标 IP 和端口.

这似乎确实是这种情况,因为在我的 VpnService 实现中覆盖 VpnService.protect(Socket)VpnService.protect(int) 并调用 supers在这两种情况下都返回 false。

如何正确保护套接字连接?

最佳答案

以下代码有效。

Socket socket = SocketChannel.open().socket();
if ((null != socket) && (null != vpnService)) {
vpnService.protect(socket);
}
socket.connect(...);

new Socket() 没有有效的文件描述符,因此无法保护。

关于android - 保护 VpnService 中的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20044213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com