Android Wi-Fi/Cellular多网络通道绑定方案对比

2023-11-22 18:40

本文主要是介绍Android Wi-Fi/Cellular多网络通道绑定方案对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

方案一:setsocketopt

方案二:android_setsocknetwork

方案三:bindSocket


本篇主要站在应用的角度来分析几种方案。

网上也有些过很多种方案,这里只是挑选几种方案分析对比下。

本质:通过netid与socket绑定的方式来创建多通道(Wi-Fi Socket/Cellular Socket)

方案一:setsocketopt

Java层通过Android接口获取并传递netid,C++创建Socket和set netid。

1. C++层创建Socket,Java层监听数据网和Wi-Fi各自对应的netid,并将各自的netid通过JNI传递到C++层;
2. C++层调用setsocketopt()函数将数据网创建的Socket打上数据网的netid标记,将Wi-Fi创建的Socket打上Wi-Fi的netid标记;
3. 后面传输数据时调用打了数据网netid标记的Socket就会用数据网传输,Wi-Fi类似。

这种方案对于应用来说需要解决的问题:需要给native进程CAP_NET_ADMIN的权限。

这里简单说明下setsocketopt()函数的系统实现:

 

方案二:android_setsocknetwork

1. C++层创建SocketJava层监听数据网和Wi-Fi各自对应的netid,并将各自的netid通过JNI传递到C++层;

2. C++层加载Android系统库函数android_setsocknetwork()去绑定netidsocket fd

3. 后面传输数据时调用打了数据网netid标记的Socket就会用数据网传输,Wi-Fi类似。

这种方案对于应用来说需要解决的问题:需要给调用者对应的uid增加Network权限,解决Permission Denied的权限问题。

 

方案三:bindSocket

以上方案一和方案二能在C++调用库函数是更好的,既可以减少JNI的回调也更稳定,但是对于应用来说需要折腾上述两种权限问题,如果是系统层面可能就更方便处理这些权限问题了,所以一般做应用的会采取当前的方案三。

1. Java层通过Android网络接口监听数据网和Wi-Fi各自对应的netid,并将各自的netid通过JNI传递到C++层;

2. C++层创建Socket,创建Socket fd完成后,先加载Android系统库函数android_setsocknetwork()去尝试用netid标记socket,如果标记失败,则将Socket fd回调的Java层,Java层先将Socket fd写入文件描述符再调用Android NetworkbindSocket()方法来给各自的socketnetid标签;

3. 后面传输数据时调用打了数据网netid标记的Socket就会用数据网传输,Wi-Fi类似。

 

上图是针对做C++跨平台(Android/iOS)  的思路,如果是单纯的Android平台,可以直接在requestNetwork()的callback中拿到netid之后继续使用就可以了。

// 1. socekt实现在C++:Java层调用Android接口绑定的主要代码

 @Overridepublic void onAvailable(Network network) {long netId = network.getNetworkHandle();...FileDescriptor fileDescriptor = new FileDescriptor();Field field = FileDescriptor.class.getDeclaredField("descriptor");field.setAccessible(true);field.setInt(fileDescriptor, socketFd);network.bindSocket(fileDescriptor);...}

// 2. 纯Android

Android netid还是很有用的,除了可以用在socket绑定,还可以用在https请求中,用例如下:

这篇关于Android Wi-Fi/Cellular多网络通道绑定方案对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412136

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat