微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 保护VpnService中的套接字

我正在探索 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.

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

解决方法

以下代码工作.
Socket socket = SocketChannel.open().socket();
if ((null != socket) && (null != vpnService)) {
    vpnService.protect(socket);
}
socket.connect(...);

新的Socket()没有有效的文件描述符,所以它不能被保护.

原文地址:https://www.jb51.cc/android/311755.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐