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
浙公网安备 33010602011771号