Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android本地VPN服务:无法转发数据包_Java_Android_Networking_Ip_Kotlin - Fatal编程技术网

Java Android本地VPN服务:无法转发数据包

Java Android本地VPN服务:无法转发数据包,java,android,networking,ip,kotlin,Java,Android,Networking,Ip,Kotlin,我正在尝试通过VPN服务实现简单的Android防火墙应用程序 基本方案如下所示: 我试图通过我的VPN服务转发数据包。因此,为了我的目的,我开始实施Google示例(不时浏览示例),但它不起作用:当我的VPN运行时,我看到数据包被发送,但我没有得到响应 该应用程序是在Kotlin上编写的,但对于Java爱好者来说并不复杂 MyBuilder配置了IP和路由,如下所示: val builder = Builder() builder.addAddress("10.0.0.2", 32).add

我正在尝试通过VPN服务实现简单的Android防火墙应用程序

基本方案如下所示:

我试图通过我的VPN服务转发数据包。因此,为了我的目的,我开始实施Google示例(不时浏览示例),但它不起作用:当我的VPN运行时,我看到数据包被发送,但我没有得到响应

该应用程序是在Kotlin上编写的,但对于Java爱好者来说并不复杂

MyBuilder配置了IP和路由,如下所示:

val builder = Builder()
builder.addAddress("10.0.0.2", 32).addRoute("0.0.0.0", 0)
mInterface = builder.establish()
之后,我将设置一个隧道,其显示方式如ToyVpn所示,但我的VPN服务器目标IP地址是本地的:

val tunnel = DatagramChannel.open()
if (!protect(tunnel.socket())) {
    throw IllegalStateException("Cannot protect the tunnel");
}
tunnel.connect(InetSocketAddress("127.0.0.1", 55555))
tunnel.configureBlocking(false)
protect(tunnel.socket())
之后,我尝试从
in
out
FileInputStream(也取自ToyVpn)转发数据包:

val`in`=FileInputStream(mInterface!!.fileDescriptor)
val out=FileOutputStream(mInterface!!.fileDescriptor)
变量计时器=0
while(true){
var idle=真
var length=`in`.read(packet.array())
如果(长度>0){
数据包限制(长度)
隧道写入(数据包);
packet.clear()
空闲=错误
如果(计时器<1){
计时器=1
}
}
长度=隧道读取(数据包)
如果(长度>0){
if(packet.get(0).toInt()!==0){
out.write(packet.array(),0,长度)
}
packet.clear()
空闲=错误
如果(计时器>0){
计时器=0
}
}
如果(空闲){
线程。睡眠(100)
计时器+=如果(计时器>0)100其他-100
如果(计时器<-15000){
packet.put(0.toByte()).limit(1)
对于(0..2中的i){
数据包位置(0)
隧道写入(数据包)
}
packet.clear()
计时器=1
}
如果(计时器>20000){
抛出IllegalStateException(“超时”)
}
}
线程。睡眠(50)
}
我的第一个问题:我做错了什么?代码是清晰的,应该可以正常工作,但它不是

基本上,我希望我的服务能够通过IP地址过滤数据包。我知道像这样的大型应用程序会从头开始解析数据包,然后重新构建数据包

我的第二个问题:如果我只想获取IP地址,有没有办法使包过滤更简单


p.S.:事实上,几天前我已经问了一个类似的问题,但这个错误还有另一个与Kotlin语言相关的性质,Kotlin语言是在该应用程序上开发的。我也看到了一些问题,但答案对我没有帮助

这是一个很长的时间,但你解决了这个问题吗?
val `in` = FileInputStream(mInterface!!.fileDescriptor)
val out = FileOutputStream(mInterface!!.fileDescriptor)
var timer = 0
        while (true) {
            var idle = true

            var length = `in`.read(packet.array())

            if (length > 0) {
                packet.limit(length)
                tunnel.write(packet);
                packet.clear()
                idle = false
                if (timer < 1) {
                    timer = 1
                }

            }
            length = tunnel.read(packet)

            if (length > 0) {
                if (packet.get(0).toInt() !== 0) {
                    out.write(packet.array(), 0, length)
                }
                packet.clear()
                idle = false
                if (timer > 0) {
                    timer = 0
                }
            }
            if (idle) {
                Thread.sleep(100)
                timer += if (timer > 0) 100 else -100
                if (timer < -15000) {
                    packet.put(0.toByte()).limit(1)
                    for (i in 0..2) {
                        packet.position(0)
                        tunnel.write(packet)
                    }
                    packet.clear()
                    timer = 1
                }
                if (timer > 20000) {
                    throw IllegalStateException("Timed out")
                }
            }
            Thread.sleep(50)
        }