android – 保护VpnService中的套接字

前端之家收集整理的这篇文章主要介绍了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()没有有效的文件描述符,所以它不能被保护.

猜你在找的Android相关文章