Xamarin.Android 虚拟专用网络API的个人粗略总结

 

简要步骤

1.询问VPN权限

2.将应用的套接字保留在系统 VPN 外部,以避免发生循环连接,因为VPN默认会强迫所有应用的数据都转发给我们的应用,所以要告诉系统,我们的套接字就不要再转发给自己了,否则任何数据都发不出去,一直打转

4.在设备上为 VPN 配置新的本地 TUN 接口,类似于创建了一个虚拟网卡,会返回一个文件句柄,读会读一个完整IP数据包,写也要写一个完整的IP数据包,所以单纯创建出VPN是没有用的

如何申请权限

询问权限,在MainActivity类中

 void Vpn()
        {
          
            var inter = VpnService.Prepare(this);

            //null有权限
            if (inter is null)
            {
                this.OnActivityResult(0, Result.Ok, null);
            }
            else
            {
                this.StartActivityForResult(inter, 0);
            }
        }

        
        protected override void OnActivityResult(int requestCode, Result resultCode, Android.Content.Intent data)
        {
            if(resultCode == Result.Ok)
            {

                StartService(new Intent(this, typeof(MyVpnService)));
            }

        }

 

 

服务的声明

[Service(Permission = "android.permission.BIND_VPN_SERVICE")]
    [IntentFilter(actions: new string[] { VpnService.ServiceInterface })]
    public sealed class MyVpnService : VpnService
    {
       
        
    }

 

 

排除自己的套接字

//C#套接字,而不是JAVA命名空间中的
Socket socket = null;
//this是VpnService的实例
this.Protect(socket.Handle.ToInt32());

 

如何创建接口

//this是VpnService的实例
var handle = new VpnService.Builder(this)
                .AddAddress("192.168.2.2", 24)
                .AddRoute("0.0.0.0", 0)
                .Establish();

            var stream = new ParcelFileDescriptor.AutoCloseInputStream(handle);

 

文档与示例

google文档,中文,可以访问

https://developer.android.google.cn/guide/topics/connectivity/vpn

可以访问的一个示例,但是是Java

https://github.com/aosp-mirror/platform_development/tree/master/samples/ToyVpn/src/com/example/android/toyvpn

也可以参考我的一个项目是C#

https://github.com/LeiKaiFeng-GoodBoy/LocalDNSProxy

 

posted @ 2021-03-04 18:37  FfD4edyo  阅读(509)  评论(0)    收藏  举报