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

相关文章

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E