Android VpnService';保护';方法不起作用

Android VpnService';保护';方法不起作用,android,vpn,Android,Vpn,我正在使用[vpn服务]()!并且能够创建VPN连接。我可以看到(tracert)所有通过VPN的互联网流量 现在,我的要求是绕过某些URL的VPN(例如www.google.com)。为了实现这一点,我编写了以下代码: if (vpnService.protect(new Socket(InetAddress.getByName("74.125.225.241"), 80))) { Log.d("TAG", "Socket protection for google.com is su

我正在使用[vpn服务]()!并且能够创建VPN连接。我可以看到(tracert)所有通过VPN的互联网流量

现在,我的要求是绕过某些URL的VPN(例如www.google.com)。为了实现这一点,我编写了以下代码:

if (vpnService.protect(new Socket(InetAddress.getByName("74.125.225.241"), 80))) {
    Log.d("TAG", "Socket protection for google.com is successfull");
}
但在访问www.google.com时,我仍然可以在tracert上看到VPN服务器ip。因此,使用这段代码,VPN服务似乎无法保护该请求不被转到VPN服务器


有谁能告诉我哪里出了问题,并建议正确的方法吗?

据我所知,您只从VPN隧道中排除(保护)一个特定的套接字

因此,使用同一目标打开的其他每个套接字仍在通过VPN隧道。
您必须在从您的设备建立到Google的每个套接字上调用protect
prepare(…)

您可以通过检查DNS查询并保存链接到要绕过的URL的IP地址来了解IP地址是否属于某个URL(如Google.com)。浏览器将首先启动DNS查询,以获取要连接到的域的IP地址。

感谢Robert的回复。我没有打开任何其他插座。一旦我建立了vpn连接,并调用了protect方法,我假设通过android浏览器浏览的任何内容都将通过这个vpn隧道。我和tracert确认了这一点。请你进一步详细说明你的回答好吗。另外,如果你能分享一些代码来做这件事,这将是非常有帮助的。但是在你的问题中,你写了“我的要求是对某些URL绕过VPN”,因此你想保护将创建到该URL/主机的任何套接字,而不是你创建但从未使用过的套接字。请注意,每个应用程序的每个TCP/UDP连接都是一个单独的套接字!是的,罗伯特,你的理解完全正确。我基本上想保护某些URL不通过VPN隧道。但是,我如何通过其他应用程序(基本上是浏览器应用程序)获得打开的套接字,以便保护这些套接字?或者,如果你能想出任何其他方法来实现我的目标,请提出建议。@shashank,如果你想从不同的应用程序中获得套接字,你基本上必须检查所有数据包,并确定目标IP是否是你想要“保护”的目标的一部分。然后,您必须创建一个新套接字,保护它,并通过新套接字传递截获的数据报。但是,请记住,IP只会告诉您目的地,而不是URL。为此,您必须读取数据的有效负载。如果数据被加密,您将无法识别URL,因为您无法读取HTTP头。@shashank,您成功地保护了某些URL吗?请告诉我,谢谢:)