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

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff