访问网络方法、装置、计算机设备和存储介质与流程

文档序号:28398724发布日期:2022-01-08 01:14阅读:63来源:国知局
访问网络方法、装置、计算机设备和存储介质与流程

1.本发明涉及计算机操作系统领域,尤其涉及一种linux兼容android的访问网络方法、装置、计算机设备和存储介质。


背景技术:

2.用户在android兼容环境中运行android应用时,通常都有进行网络访问的需求,例如:观看在线视频,浏览网页,登录软件等等。由于容器docker的隔离作用,运行于容器的android系统无法直接使用宿主机linux系统的网络。
3.现有技术存在的问题:dns(domain name system域名系统)解析的问题。由于android系统和linux系统在一些基础依赖库上的差异,导致android系统和linux系统在进行dns解析时存在差异。具体来说,就是getaddrinfo,getnameinfo,gethostbyaddr,getaddrbyname等等dns的解析函数依赖于一些c/c++基本库,android系统c/c++库使用的是bionic库,而gnu/linux以及其他类unix系统的基础函数库使用的是libc。这个差异导致了,运行于容器内的android系统无法进行正常的dns解析,只能通过ip来访问网络,其访问网络的功能是不完整的,有重大缺陷的。此外,现有技术还存在android系统检测网络功能的问题。android系统有一套检测网络的机制,当使用容器默认的网络时,这个网络既不是无线网络,也不是4g网络,android系统在检测网络连接状态时,会断定android系统既没有连接无线网络,也没有连接4g网络,导致android系统判断网络没有连接。


技术实现要素:

4.为了解决在linux兼容android环境中,android访问网络的问题,本发明提供了一种linux兼容android的访问网络方法、装置、计算机设备和存储介质。
5.第一方面,本发明提供一种linux兼容android的访问网络方法,所述方法为:
6.android系统或android应用调用bionic库的dns模块发起dns请求;
7.bionic库的dns模块对dns请求信息编码,将编码后的数据通过socket发送给linux;
8.linux的后台服务进程接收编码后的dns请求信息,查询dns缓存表,若查询获得dns请求的历史缓存记录,则将dns请求的结果信息编码后发送给android;若未查询到历史缓存记录,则对已编码的dns请求信息解码,调用linux的libc库进行dns请求;
9.linux的libc库将dns请求的结果信息编码后发送给android侧bionic库的dns模块;android侧bionic库的dns模块对接收的dns请求的结果信息解码,将解码的dns请求的结果信息返回给android系统或android应用。
10.进一步地,所述方法中的dns请求信息包括:bionic库的dns请求函数名称以及dns请求函数的参数。
11.进一步地,所述方法中的linux的后台服务进程接收编码后的dns请求信息,查询dns缓存表,若查询获得dns请求的历史缓存记录,则将dns请求的结果信息编码后发送给
android,具体为:
12.linux的后台服务进程接收到编码后的dns请求信息字符串后,以dns请求信息字符串为关键字,在dns缓存表中,以倒序的方式轮询是否存在dns请求的历史缓存记录;如果存在,则linux的后台服务进程将dns请求的结果信息编码后通过socket发送给android侧bionic库的dns模块。
13.进一步地,所述方法中调用linux的libc库进行dns请求,具体为:
14.根据dns请求信息中的bionic库的dns请求函数名称以及dns请求函数的参数,调用linux的libc库相应的dns请求函数,对dns请求函数的参数变换处理后进行dns请求。
15.进一步地,所述方法还包括:
16.linux的后台服务进程接收编码后的dns请求信息,若未查询到历史缓存记录,则对已编码的dns请求信息解码,对dns请求信息中的函数参数变换处理:将参数名称为ftp、http、https的,分别转换为服务端口号22、8080、443。
17.第二方面,本发明提供一种linux兼容android的访问网络装置,所述装置包括:
18.存储器,用于存储程序;
19.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行上述方法的步骤。
20.第三方面,本发明提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述方法的步骤。
21.第四方面,本发明提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述方法的步骤。
22.本发明与现有技术相比,具有以下优点:
23.实现了在linux兼容android的环境下,android能正常进行网络访问。另外,当android应用检测网络连接状态后,android系统返回wifi已经连接的状态给应用,这样,android系统的网络检测功能也正常了。
附图说明
24.图1为本发明实施例提供的一种linux兼容android的访问网络方法示意图;
25.图2为本发明实施例提供的一种linux兼容android的访问网络装置组成示意图。
具体实施方式
26.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
27.对于在linux操作系统上兼容运行android的环境来说,android运行环境是运行在容器中的。
28.通过容器技术可以在linux系统运行一个新的linux系统(包括其他基于linux系统定制的系统,如android),容器使得客户机系统和主机系统相互隔离。与传统的基于虚拟机技术的方案不同,在容器技术中,客户系统与主机系统共享cpu、内存、存储等资源,资源
开销很低。此外,通过适当的配置,还能使客户系统直接访问主机的硬件资源,进一步提升客户系统的性能。
29.bionic库的dns模块是android系统中用来处理dns请求的模块,而linux系统中是通过libc基础库来进行dns请求的。由于android系统和linux系统的差异,导致运行于容器内的android系统使用bionic基础库进行dns请求时出错。
30.在bionic的dns模块中,用来进行dns请求的函数主要有:
31.gethostbyname:用域名或主机名获取ip地址;
32.gethostbyaddr:根据ip地址获取主机完整信息;
33.getaddrinfo:gethostbyname函数的升级版本,用来替代gethostbyname函数,即通过域名或主机名获取ip地址,或者通过服务名获取端口号;
34.getnameinfo:gethostbyaddr函数的升级版本,用来替代gethostbyaddr函数,这个函数与getaddrinfo互补,根据ip地址获取主机完整信息或者根据服务端口号获取服务端口名。
35.图1是本发明实施例提供一种linux兼容android的访问网络方法,所述方法为:
36.android系统或android应用调用bionic库的dns模块发起dns请求;
37.bionic库的dns模块对dns请求信息编码,将编码后的数据通过socket发送给linux;
38.linux的后台服务进程接收编码后的dns请求信息,查询dns缓存表,若查询获得dns请求的历史缓存记录,则将dns请求的结果信息编码后发送给android;若未查询到历史缓存记录,则对已编码的dns请求信息解码,调用linux的libc库进行dns请求;
39.linux的libc库将dns请求的结果信息编码后发送给android侧bionic库的dns模块;android侧bionic库的dns模块对接收的dns请求的结果信息解码,将解码的dns请求的结果信息返回给android系统或android应用。
40.由于在linux兼容android环境中,bionic库的dns模块在处理dns请求时出错,所以需要将android侧的dns请求进行编码后发送给linux侧,由linux侧来处理实际的dns请求。
41.具体的,以getaddrinfo函数为例,编码的方式如下:
42.以下是getaddrinfo函数的原型:
43.int getaddrinfo(const char*hostname,const char*service,const struct addrinfo*hints,struct addrinfo**result);
44.其中,hostname是主机名称或者ip地址,例如:"www.baidu.com"或者"36.152.44.96",service是十进制端口号或者常用服务名称如"22","8080","443"或者"ftp"、"http"、"https"等,hints是获取信息要求的设置,result是获取信息的结果。
45.其中,hints参数指向用户设定的struct addrinfo结构体,只能设定该结构体中ai_family、ai_socktype、ai_flags和ai_protocol四个域。
46.ai_family:指定返回地址的协议簇,取值范围:af_inet(ipv4)、af_inet6(ipv6)、af_unspec(ipv4 and ipv6);
47.ai_socktype:用于设定返回地址的socket类型;
48.ai_flags:附加选项,多个选项可以使用或操作进行结合;
49.ai_protocol:协议类型,常用的有ipproto_tcp、ipproto_udp等,设置为0表示所有协议。
50.bionic库的dns模块会将getaddrinfo函数的函数名称和函数参数进行编码,编码成一个字符串,相关参数以空格分割开,例如编码后的字符串:getaddrinfo yyb.eve.mdt.qq.com null 0 0 4 0表示调用getaddrinfo函数,函数参数主要有:yyb.eve.mdt.qq.com是hostname参数,即主机名;null为service参数,表示服务名称为空;0 0 4 0表示获取信息的设置参数hints,0 0 4 0依次表示ai_family,ai_socktype,ai_flags,ai_protocol。
51.进一步地,所述方法中的dns请求信息包括:bionic库的dns请求函数名称以及dns请求函数的参数。
52.进一步地,所述方法中的linux的后台服务进程接收编码后的dns请求信息,查询dns缓存表,若查询获得dns请求的历史缓存记录,则将dns请求的结果信息编码后发送给android,具体为:
53.linux的后台服务进程接收到编码后的dns请求信息字符串后,以dns请求信息字符串为关键字,在dns缓存表中,以倒序的方式轮询是否存在dns请求的历史缓存记录;如果存在,则linux的后台服务进程将dns请求的结果信息编码后通过socket发送给android侧bionic库的dns模块。
54.由于在某一个android应用中,在相近的时间内,经常会有进行多次相同的dns请求的可能,采用倒序的方式进行轮询,可以节省dns缓存轮询的时间,从而加快dns请求的速度。
55.进一步地,所述方法中调用linux的libc库进行dns请求,具体为:
56.根据dns请求信息中的bionic库的dns请求函数名称以及dns请求函数的参数,调用linux的libc库相应的dns请求函数,对dns请求函数的参数变换处理后进行dns请求。
57.linux的后台服务进程查询相关的dns请求没有缓存信息,则会将dns请求的数据进行解码的处理,例如,当linux的后台服务接收到以下数据时:
58.getaddrinfo yyb.eve.mdt.qq.com null 0 0 4 0
59.使用c语言的字符串分割函数strtok(null,""),以空格作为分隔符,依次从接收到的数据流中提取出所有的函数名称和函数参数信息。
60.在进行解码处理后,linux的后台服务进程会根据dns请求的相关函数和参数,调用linux系统上的libc库的相处理dns请求函数,同样是如下四个函数:getaddrinfo,getnameinfo,gethostbyname,gethostbyaddr。
61.进一步地,所述方法还包括:
62.linux的后台服务进程接收编码后的dns请求信息,若未查询到历史缓存记录,则对已编码的dns请求信息解码,对dns请求信息中的函数参数变换处理:将参数名称为ftp、http、https的,分别转换为服务端口号22、8080、443。
63.具体地,由于linux系统libc库和android系统bionic库的dns模块的差异性,android系统bionic库的dns模块发送过来的部分dns请求,还需要解码后做一些特殊处理。例如:linux系统libc库在进行getaddrinfo处理时,如果服务名service参数是"ftp"、"http"、"https"时,需要先使用getservbyname函数将服务名称转换为服务端口号"22","
8080","443"。
64.如果linux的后台服务进程调用libc库进行dns请求失败了,则还需要将libc的dns请求出错码转换成android能够识别的dns请求出错码。
65.此外,关于将dns请求的结果信息编码后发送给android的原因。如上文bionic库的dns模块将dns请求进行编码后发送所述,getaddrinfo函数的返回结果存放在struct addrinfo**result参数中,result的数据类型是addrinfo结构体。
66.addrinfo结构体主要在网络编程解析主机名时使用,其在头文件#include《netdb.h》中,定义如下:
67.struct addrinfo{
68.int ai_flags;/*ai_passive,ai_canonname,ai_numerichost*/
69.int ai_family;/*pf_xxx*/
70.int ai_socktype;/*sock_xxx*/
71.int ai_protocol;/*0or ipproto_xxx for ipv4 and ipv6*/
72.socklen_t ai_addrlen;/*length of ai_addr*/
73.char*ai_canonname;/*canonical name for hostname*/
74.struct sockaddr*ai_addr;/*binary address*/
75.struct addrinfo*ai_next;/*next structure in linkedlist*/
76.};
77.其中ai_family、ai_flags、ai_protocol和ai_socktype字段和前文一致。
78.其中ai_addr表示域名的ip地址信息。
79.其中ai_next指向下一个addrinfo结构体,由于一个域名可以对应多个ip地址,通过遍历ai_next参数可以获取域名的所有ip地址信息。
80.由于struct addrinfo**result数据变量是一个指向指针的指针类型,如果直接传递这个变量给android,由于容器的隔离作用,android将无法解析这个变量的内容,所以需要在linux将这个变量的内容解析出来后,进行编码,再传递给android。
81.另外,由于android系统初始并没有连接的wifi,所有当android应用查询android系统的网络状态时,会返回网络没有连接的信息,导致应用可能会提示没有网络,且不再进行网络请求。所以需要在android系统中进行适配,返回一个wifi网络已经连接的信息给androd应用。
82.在android系统中,主要用来管理网络连接的类是connectivitymanager,常用的用来获取网络状态的方法有:getactivenetworkinfo、getallnetworkinfo、getactivenetwork、getnetworkcapabilities等接口。当android应用调用这些接口时,需要返回一个wifi网络已经连接的信息给androd应用。
83.下面以getactivenetworkinfo为例,以下是本方案在getactivenetworkinfo接口中增加的代码:
84.final networkinfo info=newnetworkinfo(connectivitymanager.type_wifi,0,"wifi","");info.setdetailedstate(detailedstate.connected,null,null);info.setisavailable(true);
85.return info;
86.从以上代码中可以看到,会返回一个已经连接的(detailedstate.connected),可用的(setisavailable)wifi(connectivitymanager.type_wifi)类型的网络。
87.图2是本发明实施例提供一种linux兼容android的访问网络装置,所述装置包括:
88.存储器,用于存储程序;
89.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行上述方法的步骤。
90.第三方面,本发明实施例提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述方法的步骤。
91.第四方面,本发明实施例提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述方法的步骤。
92.最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1