使用adns库解析域名
1. adns、adns-python库简介
adns库是一个可进行异步非阻塞解析域名的库,主要使用C语言编写,在linux平台下运行。使用adns库进行域名解析效率非常,著名的开源网络爬虫larbin就使用adns库进行域名解析。可惜的是,adns库没有说明文档。作者的意思是,adns.h这个文件即可说明这个库的使用方法。非常遗憾,我不太懂dns解析过程中所涉及到的各种细节知识,对C语言的掌握程度也没能达到出神入画的境界,所以,我不得不承认,光凭这个adns.h,我无法知道应该如何使用adns库这一强大的工具。
adns-python库是adns库的python扩展。在python程序中,可调用其他语言写好的函数。由于adns比较优秀,所以有人为它开发了一个python扩展程序。查了下Python扩展程序的相关内容,了解到写这种扩展程序是有模板的。首先,应该在file1.c文件中把核心函数写好。然后,再开发一个为这些核心文件开发python扩展模块文件(也为一个.c文件)。通常,扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数。python扩展模块保存在file2.c文件中。最后,通过编译,将这些核心函数编译成一个python程序可调用的函数。这么说起来比较抽象,可以参考这篇文章(http://www.ibm.com/developerworks/cn/linux/l-pythc/)或者《python核心编程(第二版)》中的第22章“扩展python”来清楚地了解Python是如何扩展C程序的。
目前,IPv4协议是互联网上的主流IP层的协议。但由于IPv4地址即将耗尽,各方都在积极推进IPv6协议。adns/adns-python协议也分为IPv4版和IPv6版。下载地址如下
adns IPv4版 adns IPv6版(1.4版可支持IPv6) adns-python IPv4版 adns-python IPv6版
2.python-adns库的安装
因为我使用python进行开发,所以使用adns-python作为我的库。由于dns解析的核心函数都在adns中,所以必须首先安装adns库后,adns-python才可以安装成功。如果想进行IPv6的地址解析,必须安装支持IPv6地址解析的adns库和adns-python库。支持IPv4的库不可解析IPv6的域名地址,但支持IPv6的库可同时支持解析IPv4和IPv6的域名地址。adns库的源代码中的INSTALL文件有说明如何安装adns库,adns-python中的README文件中也有说明如何安装adns-python库。支持IPv4和支持IPv6的库安装步骤类似。
安装adns库:
$ ./configure [--disable-dynamic] [--prefix=...]
$ make
# make install
注意,make install这一命令需要有root权限 安装adns-python库:
$ python setup.py build (如果提示没有python.h文件,请安装python-devel。 命令为: yum install python-devel)
# python setup.py install
注意,python setup.py install这一命令需要有root权限
3. python-adns库的使用
这里有一个利用adns-python库写的dns解析的代码。起先我不太明白为什么作者就能知道应该这样使用这些库中的函数,因为adns-python库与adns库一样,没有说明文档。后来,经高人指点,发现adns-python库中有一个ADNS.py文件,这个文件中QueryEngine类,这个类中定义的函数即给我们示范了库中提供的常用函数的使用方法。至于这些常用函数具有什么样的功能,应该如何使用等问题,只能有去源代码中找寻答案啦~~
如果代码报错,提示:libadns.so.1: cannot open shared object file: No such file or directory. 可以这样解决:
1. vim /etc/ld.so.conf
2. 添加该lib所在的路径 (libadns.so.1的路径通常中/usr/local/lib )
3. ldconfig
这是因为libadns.so.1不在默认共享库路径下。具体可参看:http://www.cnblogs.com/xuxm2007/archive/2010/08/10/1796254.html
把人家的代码贴在这里好啦:
#!/usr/bin/python
# import adns
from time import time class AsyncResolver(object):
def __init__(self, hosts, intensity=100):
"""
hosts: a list of hosts to resolve
intensity: how many hosts to resolve at once
"""
self.hosts = hosts
self.intensity = intensity
self.adns = adns.init() def resolve(self):
""" Resolves hosts and returns a dictionary of { 'host': 'ip' }. """
resolved_hosts = {}
active_queries = {}
host_queue = self.hosts[:] def collect_results():
for query in self.adns.completed():
answer = query.check()
host = active_queries[query]
del active_queries[query]
if answer[0] == 0:
ip = answer[3][0]
resolved_hosts[host] = ip
elif answer[0] == 101: # CNAME
query = self.adns.submit(answer[1], adns.rr.A)
active_queries[query] = host
else:
resolved_hosts[host] = None def finished_resolving():
return len(resolved_hosts) == len(self.hosts) while not finished_resolving():
while host_queue and len(active_queries) < self.intensity:
host = host_queue.pop()
query = self.adns.submit(host, adns.rr.A)
active_queries[query] = host
collect_results() return resolved_hosts if __name__ == "__main__":
host_format = "www.host%d.com"
number_of_hosts = 20000 hosts = [host_format % i for i in range(number_of_hosts)] ar = AsyncResolver(hosts, intensity=500)
start = time()
resolved_hosts = ar.resolve()
end = time() print "It took %.2f seconds to resolve %d hosts." % (end-start, number_of_hosts)
使用adns库解析域名的更多相关文章
- 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程
第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...
- [深入浅出Windows 10]QuickCharts图表控件库解析
13.4 QuickCharts图表控件库解析 QuickCharts图表控件是Amcharts公司提供的一个开源的图表控件库,这个控件库支持WPF.Silverlight.和Windows等 ...
- 使用QtScript库解析Json数组例子
本文转载自:http://blog.sina.com.cn/s/blog_671732440100uwxh.html 使用qtscipt库解析json数组首先在工程文件中加 QT += ...
- linux服务器wget无法成功解析域名及程序获取外网数据不稳定问题
1.问题描述: 1.1 最近发现通过linux服务器wget下载远程文件经常提示无法解析域名问题,要重复多次才能成功,成功率比较低. 1.2 PHP用file_get_contents()函数获取淘宝 ...
- 【OCP|052】OCP最新题库解析(052)--小麦苗解答版
[OCP|052]OCP最新题库解析(052)--小麦苗解答版 OCP最新题库解析历史连接(052):http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA ...
- SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution
一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...
- Linux系统解析域名的先后顺序【转帖】
Linux系统解析域名的先后顺序 gd_WWW已经在本地(/etc/hosts)进行指向,但是竟然还能解析到外网,让我百思不得其解.经过不断查找发现域名解析与以下四个文件有关: /etc/hosts ...
- Linux下解析域名命令-dig 命令使用详解
Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息.dig 命令主要用来从 DNS 域名服务器查询主机地址信息.dig的全称是 (dom ...
- Linux系统不能解析域名
问题:正在使用的Linux系统突然有一天不能解析域名gus.xxxxxxxx.com? # ping gus.xxxxxxxx.com ping: unknown host gus-xxxxxxxx. ...
随机推荐
- Oracle 数据库中日期时间的插入操作
Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...
- JdbcTemplate与事务
JdbcTemplate操作采用的是JDBC默认的AutoCommit模式,也就是说我们还无法保证数据操作的原子性(要么全部生效,要么全部无效),如: JdbcTemplate jdbcTemplat ...
- 获取当前的 viewController
- (UIViewController *)currentController { UIViewController *result = nil; UIWindow *window = [ ...
- SSD Cloud Hosting - Linode的配置和部署,搭建Java环境
0.发牢骚 前一个月在淘宝购买了个Jsp空间,挺便宜的,才38元/年.部署了程序,然后ALIMAMA验证网站,一直提示验证失败.最后找卖家,他说可能是因为空间太慢,照他的推荐换了最好的空间,138元/ ...
- Nodejs_day02
Nodejs的事件模块 var events = require('events'); var eventEmitter = new events.EventEmitter();//创建EventEm ...
- MFC类目录及头文件(转)
类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsy ...
- ubuntu 下安装sh 文件
1. cd 到 指定文件夹 如: cd /home/ddy/下载 2. sudo chmod +x *.sh 3. sudo ./*.sh ok 了 (1)数据预处理 可以用下载好的数据集,也可 ...
- 40个超酷的jQuery动画效果教程
自从出现,jQuery就在web领域就引起了轰动,现在它已经成为Web动画效果的最佳解决方案之一.jQuery提供了良好的交叉浏览器支持,并且轻便易用.现在,jQuery在定义和控制小型的Web动画诸 ...
- 解决“运行arm-linux-gcc命令,提示No such file or directory”的问题
今天在ubuntu14.04上安装arm的交叉编译器arm-linux-gcc,环境变量配置好以后,运行arm-linux-gcc命令,总提示No such file or directory.然后去 ...
- Spark RDD概念学习系列之RDD的操作(七)
RDD的操作 RDD支持两种操作:转换和动作. 1)转换,即从现有的数据集创建一个新的数据集. 2)动作,即在数据集上进行计算后,返回一个值给Driver程序. 例如,map就是一种转换,它将数据集每 ...