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库解析域名的更多相关文章

  1. 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程

    第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...

  2. [深入浅出Windows 10]QuickCharts图表控件库解析

    13.4 QuickCharts图表控件库解析     QuickCharts图表控件是Amcharts公司提供的一个开源的图表控件库,这个控件库支持WPF.Silverlight.和Windows等 ...

  3. 使用QtScript库解析Json数组例子

    本文转载自:http://blog.sina.com.cn/s/blog_671732440100uwxh.html 使用qtscipt库解析json数组首先在工程文件中加 QT        += ...

  4. linux服务器wget无法成功解析域名及程序获取外网数据不稳定问题

    1.问题描述: 1.1 最近发现通过linux服务器wget下载远程文件经常提示无法解析域名问题,要重复多次才能成功,成功率比较低. 1.2 PHP用file_get_contents()函数获取淘宝 ...

  5. 【OCP|052】OCP最新题库解析(052)--小麦苗解答版

    [OCP|052]OCP最新题库解析(052)--小麦苗解答版 OCP最新题库解析历史连接(052):http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA ...

  6. SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution

    一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...

  7. Linux系统解析域名的先后顺序【转帖】

    Linux系统解析域名的先后顺序 gd_WWW已经在本地(/etc/hosts)进行指向,但是竟然还能解析到外网,让我百思不得其解.经过不断查找发现域名解析与以下四个文件有关: /etc/hosts ...

  8. Linux下解析域名命令-dig 命令使用详解

    Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息.dig 命令主要用来从 DNS 域名服务器查询主机地址信息.dig的全称是 (dom ...

  9. Linux系统不能解析域名

    问题:正在使用的Linux系统突然有一天不能解析域名gus.xxxxxxxx.com? # ping gus.xxxxxxxx.com ping: unknown host gus-xxxxxxxx. ...

随机推荐

  1. [转] C# 绘制报表,使用Graphics.DrawString 方法

    原文 Graphics.DrawString 方法 在指定位置并且用指定的 Brush 和Font 对象绘制指定的文本字符串. public void DrawString( string s, Fo ...

  2. OSX 10.10安装教程。

    现在苹果已经放出了OS X 10.9 Mavericks第一个开发者预览版,从Mac App Store中获得的安装程序,可以在10.8的系统中直接进行升级,原有文件都会保留.但是要想制作成一个10. ...

  3. Drupal如何更新注册表?

    Drupal的注册表是指registry和registry_file两个数据表.前一个表保存所有可用的类和接口以及它们所对应的文件,后一个表保存每个文件的hash码. 1. 将所有需要更新的文件都汇总 ...

  4. 序列for循环语句

    序列for循环语句 序列for循环语句允许重复遍历一组序列,而这组序列可以是任何可以重复遍历的序列,如由begin()和end()函数定义的STL序列.所有的标准容器都可用作这种序列,同时它也同样可以 ...

  5. Python 批量创建同文件名的特定后缀文件

    看了很多批量创建文件和文件批量格式转换的code,感觉杀鸡焉用牛刀,自己写了几行轻量级的拿来给大家参考: 在out_dir目录下批量创建与in_dir目录下同文件名但后缀不同的文件. in_dir = ...

  6. Hadoop第三天---分布式文件系统HDFS(大数据存储实战)

    1.开机启动Hadoop,输入命令:  检查相关进程的启动情况: 2.对Hadoop集群做一个测试:   可以看到新建的test1.txt和test2.txt已经成功地拷贝到节点上(伪分布式只有一个节 ...

  7. 父视图 使用 UIViewAnimationWithBlocks 时,如何让子视图无动画

    tableView使用 UIViewAnimationWithBlocks 时 上面的cell也会一起出现动画, 所以在设置cell的时候 添加 [UIView performWithoutAnima ...

  8. oracle查看相关用户表

    select TABLE_NAME from user_tables  //当前用户表 select TABLE_NAME from dba_tables  //所有用户表+系统表 select TA ...

  9. cocos2d-x 3.2 例子文件工程的位置

    更新到3.2后突然想要看看官方的例子,忽然发现在test中的cpp工程下面没有了工程的启动配置.奇怪,难道只有代码吗?重新查找后原来启动的工程文件都移动到了build文件夹下面,具体的路径就是 coc ...

  10. error日志

    2016/06/15 微信调核心时通用意外险 2016-06-15 11:44:23,771>>INFO >> com.isoftstone.core.service.comm ...