一种非阻塞获取域名IP地址的方法与系统与流程

文档序号:12279034阅读:322来源:国知局

本发明属于通信技术领域,尤其涉及一种非阻塞获取域名IP地址的方法与系统。



背景技术:

目前互联网上的资源地址以统一资源定位符(URL)来标识,URL也被称为网页地址,其为因特网上标准的资源地址,URL通常以域名的方式体现。

域名是指由一串用点分隔的名字组成的因特网上的某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

用户在访问网络上的资源时,资源地址通常以URL的形式表达,而URL中的域名则表示了服务器所在的地址,但是,服务器在网络上一般使用IP地址来表示其地址。获取域名对应的IP地址可称为域名解析。

在对包含域名的URL网络请求进行处理时,通常要进行域名解析以获取该域名对应的IP地址。例如查询www.sina.com.cn对应的IP地址时,服务器得到查询请求后,调用库函数gethostbyname()将域名对应的IP地址返回给客户端。

但若调用库函数gethostbyname()短时间不能得到服务器响应的话,它不会立刻退出,而是一直等待,直到超时退出,此过程耗时约30秒。其导致页面长时间等待,无法响应用户的操作。并且gethostbyname()函数是linux库函数,通用性较强,不方便对其进行修改。

现有技术中为解决域名解析时的阻塞问题,公开了多种解决方案。例如,公开号为CN103581349A的中国专利“一种域名解析方法及装置”,其在域名解析模块上建立两个以上用于域名解析的线程,当有解析请求时,则从多个线程中选择一个可用的。当所有的线程都不可用时,则新建一个或者进入等候队列。此举虽然降低了解析过程中的阻塞率,降低了网页假死概率,但是由于需要建立多个线程,无疑加大了服务器负担。

又如,公开号为CN104683501A的中国专利“一种域名解析方法以及装置”,其通过设置域名缓冲表,当有域名解析请求时,先检查本地域名缓冲表内是否存在对应的解析信息,若有则直接返回解析信息,若无才向服务器请求对应的解析信息,以节省域名解析时间。但是,此种方案加大了本地客户端的负担,需额外设置域名缓冲表。



技术实现要素:

本发明所要解决的技术问题是针对现有技术的上述不足,提出一种采用主子进程的方式获取域名地址,将实际获取域名地址的gethostbyname()函数放在子进程中,而主进程可以控制子进程的关闭进而缩短页面等待时间的非阻塞获取域名IP地址的方法。

本发明的另一目的是提供一种非阻塞获取域名IP地址的系统。

本发明解决其技术问题采用的技术方案如下:

一种非阻塞获取域名IP地址的方法,其包括如下具体步骤:

通过主进程获取域名解析请求;

主进程创建子进程;

子进程调用gethostbyname()函数以获取域名对应IP地址;

主进程监控子进程是否获取到IP地址,若获取到,则继续运行,若未获取到,则主进程等待预设时间后停止等待。

进一步地,所述主进程通过调用fork()函数创建子进程。

进一步地,所述子进程获取到IP地址后将IP地址写入预设文件中,主进程检测该预设文件是否有内容进而判断子进程是否获取到IP地址。

进一步地,所述子进程获取到IP地址后创建IP地址文件,主进程监测是否存在IP地址文件进而判断子进程是否获取到IP地址。

进一步地,所述主进程停止等待后,子进程超时退出。

进一步地,所述主进程停止等待后,子进程被主进程删除。

本发明还提供一种非阻塞获取域名IP地址的系统,本发明的系统具体包括如下单元:

主进程创建单元,用于创建访问域名的主进程;

子进程创建单元,通过主进程创建子进程;

IP地址获取单元,通过子进程调用gethostbyname()函数以获取域名对应IP地址。

进一步地,还包括监控单元,主进程通过监控单元监控子进程是否获取到IP地址,若获取到,则继续运行,若未获取到,则主进程等待预设时间后停止等待。

进一步地,所述子进程创建单元为fork()函数,主进程通过fork()函数创建子进程。

进一步地,还包括IP地址写入文件,所述子进程获取IP地址后写入IP地址写入文件,所述监控单元监控IP地址写入文件是否存在内容。

进一步地,还包括子进程删除单元,用于当主进程停止等待后删除由该主进程创建的子进程。

本发明技术方案采用主子进程的方式获取域名地址,将实际获取域名地址的gethostbyname()函数放在子进程中,而主进程可以控制子进程的关闭进而缩短页面等待时间。

附图说明

图1为本发明一优选实施例的系统流程图。

具体实施方式

以下是本发明的具体实施例并结合附图,对本发明的技术方案作进一步的描述,但本发明并不限于这些实施例。

实施例1

本发明涉及一种非阻塞获取域名IP地址的方法,其中,非阻塞是相对于现有技术中的阻塞而言。具体的,“阻塞”是指某一进程必须经过等待一定时间后才能进行下一进程。而相应的,“非阻塞”是指某一进程可以绕过该等待时间直接进行下一进程。

用较通俗的语言解释即为:若开车去某一地方,其中某一段道路堵车,“阻塞”的实现方式是等到堵车状况结束才继续开完下一目的地,而缓解“堵塞”达到“非堵塞”的方法则是想办法绕过堵车路段或者减少堵车概率。

具体到本发明技术方案中,若想获取域名对应的IP地址,可以用多种方式实现,但是,本申请仅针对利用gethostbyname()函数实现的方式。由于gethostbyname()函数是liunx系统的库函数,可以通过程序直接调用,因此实现方式较为简单、应用范围较广。但又由于gethostbyname()函数是阻塞函数,即,若其不能得到服务器响应的话,其必须等待较长的时间才能自动退出。该时间通常为30秒左右,该等待时间对于路由器的页面操作是致命的。但是直接修改gethostname()函数会导致整个系统中其他调用该函数的系统出现错误。

为此,本实施例通过如下具体方案解决上述问题。

请参照图1,本实施例中,非阻塞获取域名IP地址的方法具体包括如下步骤:

主进程获取域名解析请求;

“域名解析”即将域名指向网络空间的IP地址。例如,假设域名为www.sina.com.cn,其对应的IP地址为17.25.36.1。域名解析请求是指用户在浏览器中输入域名后,域名服务器找到该域名对应的IP地址的过程。只有获取IP地址后,才能与目标网络进行通信。

“进程”是指具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作系统的基本单元。

主进程创建子进程;

“子进程”是相对于“主进程”而言。“子进程”是指可独立执行某一功能,但是,受到“主进程”控制,可被“主进程”终止的一类进程。“子进程”被“主进程”终止后,“子进程”所拥有的全部资源,或者归还给“主进程”或者归还给系统。

主进程创建子进程可采用其运行的系统设定的多种方法。例如,在Linux系统,即,可采用fork()函数,vfork()函数和clone()函数三种创建方法,每种创建方法产生的子进程在地址、资源、执行功能、与主进程之间的关系上均不大相同。

其中,fork()函数拷贝主进程的数据段和代码段、vfork()函数与主进程共享数据段、clone()函数可由使用者选择继承主进程的资源。

本实施例中,主进程通过fork()函数创建子进程。

通过fork()函数创建的子进程是与主进程几乎完全相同的进程,也即,主进程与子进程可以做完全相同的事,但是,子进程受到主进程控制。

由于主进程的任务是域名解析,因此,其通过fork()函数创建的子进程的任务也是域名解析。此时,子进程调用gethostbyname()函数以获取域名对应的IP地址。

也即,在上述实例中,用户输入www.sina.com.cn的域名后,子进程通过gethostbyname()函数获取17.25.36.1这一IP地址。

gethostbyname()函数在linux系统即被定义为通过域名或者主机名获取IP地址的函数。由于其直接对应域名解析这一功能,无需额外编程,因此,被广泛运用。

gethostbyname()函数的传入值为域名或主机名,传出值为一个hostentd的结构,具体如下:

其中,hostent->h_name表示的是主机的规范名。例如,www.google.com的规范名其实是www.l.google.com

hostent->h_aliases表示的是主机的别名.www.google.com就是google他自己的别名。有时,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

hostent->h_addrtype表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)。

hostent->h_length表示的是主机ip地址的长度。

hostent->h_addr_lisst表示的是主机的ip地址。

子进程调用gethostbyname()函数后,主进程监控子进程是否获得IP地址,若获取IP地址,则由主进程将该IP地址返回客户端;若超过一段时间未获取,则主进程停止。

也即,无论子进程是否最终顺利获取到IP地址,系统运行不会因此而耽搁,整个系统不会停在那里等待gethostbyname()函数响应或未响应退出。也即本申请所指的“非阻塞获取域名IP地址”。

实施例2

本实施例与实施例1的不同之处在于,本实施例的子进程获得IP地址后,将IP地址写入预设文件中。

主进程通过检测该预设文件是否存在内容进而判断子进程是否成功获取IP地址。

该预设文件通常存放于为系统临时文件夹内,例如,/TMP/IPaddr文件夹中,也可以存放于其他文件夹中。

当主进程经过预设时间(通常小于30秒),仍未检测到/TMP/IPaddr文件内有内容后,其退出。

主进程退出后,子进程处于阻塞状态。子进程可以在阻塞时间(30秒)结束后自行退出,也可以由主进程主动删除。

本实施例的此种执行方式,不会引起资源浪费。

本实施例的其它内容可参考实施例1。

实施例3

本实施例与实施例2的不同之处在于:

在实施例2中,主进程需要检测文件内容,此种检测也较耗系统资源。

而本实施例中,在子进程获取到IP地址后直接创建IP地址文件。主进程仅需检测预设文件夹内是否存在文件即可判断子进程是否成功获取IP地址。

同样地,若主进程经过预设时间(通常小于30秒),仍未检测到IP地址文件,则子进程超时退出或被主进程删除。

上述三个实施例可应用于各类网络连接类型中,例如,WIFI连接、以太网连接、3G数据连接、4G数据连接等均可适用。

上述三个实施例还可应用于各类存在需要请求IP地址以及需要与外接通信的网络设备中,例如:路由器、智能电视、智能手机等。

下面以路由器通过以太网连接请求解析新浪网IP地址为例,详细说明本申请的基本工作流程:

1、用户在操作页面,例如,IE浏览器输入新浪网域名(www.sina.com.cn),并点击回车键;

2、系统响应用户操作,建立主进程以准备访问www.sina.com.cn;

3、主进程通过fork()函数建立子进程;

4、子进程调用gethostbyname()获取www.sina.com.cn对应的ip地址;

5、主进程进行循环等待,并监控子进程是否成功获取对应的ip地址;

6、若子进程成功获取www.sina.com.cn的ip地址17.25.36.1,则将ip地址17.25.36.1写入系统tmp文件夹下的ipaddr文件内;主进程监测到ipaddr文件内存在内容后则结束等待,继续运行;

7、若子进程由于网络问题或者对方服务器问题或者用户输入错误的域名导致不能在预设时间内获取ip地址,则主进程等待预设时候停止等待。系统可继续进行下一步活动;

8、主进程停止等待后,子进程在一段时间内自动退出或者被主进程删除。

本发明还提供了一种非阻塞获取域名IP地址的系统,其具体包括如下单元:

主进程创建单元,用于响应用户操作由系统创建一个准备访问特定域名的主进程;

创建进程是系统将文本区域(text region)、数据区域(data region)和堆栈(stack region)分配给某一地址空间的过程。其中,文具区域存储执行代码,数据区域存储变量和执行期间使用的内存,堆栈存储活动过程中调用的指令和本地变量。

子进程创建单元,与主进程由系统创建不同,子进程由主进程创建。

在一优选实施例中,子进程由主进程通过fork()函数创建。通过fork()函数创建的子进程在上述文本区域(text region)、数据区域(data region)和堆栈(stack region)上与主进程相同,其与主进程执行相同任务。

IP地址获取单元,子进程调用系统已存在的gethostbyname()函数以获取域名对应IP地址。

该步骤由系统自动运行产生,无需额外设置。

上述系统还包括监控单元,在子进程获取IP地址的过程中,主进程通过监控单元监控子进程是否顺利获取到IP地址,若顺利获取,则主进程继续运行,若未获取,则主进程等到预设时间后停止等待,则系统继续执行下一个任务。

监控单元监控的信息可以为某一文件内容,某一文件是否存在,或者某一信息等。

作为更优选方案,本发明还包括IP地址写入文件,子进程在获取到IP地址后将IP地址写入到该IP地址写入文件中。

监控单元通过监控该IP地址写入文件是否有内容来判断子进程是否成功获取IP地址。

若子进程未能成功获取IP地址,本发明还包括有子进程删除单元。在主进程等待超过预设时间后,子进程删除单元将子进程删除,从而节省了系统的资源。

本发明相对现有技术具有如下技术效果:

1、本发明采用主子进程的方式,将容易阻塞的gethostbyname()函数放入子进程中,使用者可以通过控制主进程的等待时间进而控制整个进程的等待时间。当发生阻塞时,无需等到gethostbyname()函数30秒响应时间到了再退出进程。

2、通过fork()函数创建子进程,可节约系统资源。

3、整体设计简单易用、针对性强,在各类域名解析场合均和应用,且无需更改原系统架构;

4、在本发明技术方案中,主进程等待时间可自主设定。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1