域名系统(DNS) 是一个分布式的数据库,它主要用来把主机名转换成IP地址。DNS以及相关系统之所以存在,主要有以下两个原因:

 
  • 它们可以使人们比较容易地记住名字,如www.baidu.com。
  • 它们允许服务器改变IP地址,但是还用同样的名字。
 
 
 
作为一个例子,让我们看一下查询    www.baidu.com  首先,您的程序会和操作系统配置文件指定的本地名称服务器通信。这个服务器是一个递归的名称服务器,它收到请求并以适当的方式传递下去,它会为您完成大量工作。
 
     递归服务器做的第一件事情是询问.com域。后者有个内置的顶级域名列表,这些服务器可以分发世界上顶级域名的信息,例如.com
 
    
 
 
     这个循环重复多次,直到最终查询到达www.baidu.com服务的名称服务器。这个服务器知道问题中的IP地址,并返回它。
 
     
 
 
使用操作系统查询服务
     操作系统本身带一些用于DNS查找的功能(经常被称为resolver库)。
 
 
 
执行基本查询
 
     最基本的查询是正向查询,它根据一个主机名来查找IP地址。例如你想从www.baidu.com上下载一个Web页面。首先您需要找到IP地址。
 
     在Python中,您将用到的函数是socket.getaddrinfo(),
 
 
 
     sockaddr实际上就是远程机器的地址。
 
     这里的值是以tuple的形式打印出来的。
 
 
 
 
 
通过getaddrinfo()获得全部的条目也是可以的。
 
 
 
import sys,socket

result = socket.getaddrinfo(sys.argv[1],None)

counter = 0

for item in result:
    print "%-2d: %s" % (counter,item[4])
    counter += 1

注意:同一条目在您的机器上也许不会显示多次。在某些平台上,例如Windows的getaddrinfo()默认只支持一种协议。即使在支持多协议的平台上,如果有些协议没有配置,也会只有一个结果。为了限制结果,让每个条目只显示一次,您需要为protocol参数设定socket.SOCK_STREAM为family参数设定0,让它支持所有family
 
 
 
 
 
这里有一个上个例子的更好的版本:
 
     import sys,socket

result = socket.getaddrinfo(sys.argv[1],None,0,socket.SOCK_STREAM)

counter = 0

for item in result:
    print "%-2d: %s" % (counter,item[4])
    counter += 1

这一次,您将看到每一个条目只显示一次。
 
 
 
 
 
执行反向查询
 
     
 
 
 
反向查找基础
 
     有一个重要的问题需要您明白,那就是,对于一个IP地址,完全有可能不存在反向的映射。事实上,很多IP地址根本就没有对应的域名。所以,您需要确保为每一个反向查找的行为捕获和处理socket.herror()。
 
 
import sys,socket

try:
    # Perform the lookup
    result = socket.gethostbyaddr(sys.argv[1])

print "Primary hostname:"
    print "  " + result[0]

print "\nAddresses:"
    for item in result[2]:
        print " " + item

except socket.herror, e:
    print "Couldn't  look up name:", e

 
 
 
 
 
对于反向查询,授权是基于IP地址的。
 
 
 
 
 
import sys,socket

def getipaddrs(hostname):
    result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM)
    return [x[4][0] for x in result]

def gethostname(ipaddr):
    return socket.gethostbyaddr(ipaddr)[0]

try:

hostname = gethostname(sys.argv[1])

ipaddrs = getipaddrs(hostname)

except socket.herror,e:
    print "No host names available for %s;this may be normal." % sys.argv[1]
    sys.exit(0)

except socket.gaierror,e:
    print "Got hostname %s,but it could not be forward-resolved: %s" % (hostname,str(e))
    sys.exit(1)

if not sys.argv[1] in ipaddrs:
    print "Got hostname %s.   but on forward lookup," % hostname
    print "original IP %s did not appear in IP address list." % sys.argv[1]
    #print "\n  %s" % (hostname)
    sys.exit(1)

print "Validated hostname:%s" % (hostname)

 
 
 
 
 
 
获得环境信息
 
 
 
import sys,socket

def getipaddrs(hostname):
    result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM)
    return [x[4][0] for x in result]

hostname = socket.gethostname()

print "Host name:", hostname

print "Fully-qualified name:", socket.getfqdn(hostname)

try:
    print "IP address:",getipaddrs(hostname)

except socket.gaierror,e:
    print "Couldn't not get IP addresses: %s",(e)

 
 
 
 
 
使用PyDNS进行高级查询
 
 
 
DNS Records
 
     当您执行任何类型的查询时,不管是通过PyDNS,还是通过前面介绍的操作系统的查询功能,您都会得到来自一个域名服务器多种类型的records。下面是您会遇到的大多数records列表:
 
 
 
 
 
 
简单的PyDNS查询
     
     PyDNS 库提供了 Python模块DNS。首先您应该在应用程序中调用DNS.DiscoverNameServers()   它可以使您找到系统中的名称服务器,在Windows系统中是注册表(registry),在UNIX系统上是 /etc/resolv.conf    全部的Pydns查询会被发送到这些服务器上。
 
 
 
 
 
初始化名称服务器后,下一步需要建立一个请求对象,这是通过调用DNS.Request()来实现的。这个对象可以用来发出任何DNS查询请求。
 
 
 
import sys,DNS

query = sys,DNS

query = sys.argv[1]

DNS.DiscoverNameServers()

reqobj = DNS.Request()

answerobj = reqobj.req(name = query,qtype = DNS.Type.ANY)

if not len(answerobj.answers):
    print "NOT FOUND."

for item in answerobj.answers:
    print "%-5s %s" % (item['typename'],item['data'])

 
 
 
 
 
没用啊!!!!
 
 
 
 
查询特殊的名称服务器
     
 
 
 

《Python网络编程基础》第四章 域名系统的更多相关文章

  1. Python网络编程基础|百度网盘免费下载|零基础入门学习资料

    百度网盘免费下载:Python网络编程基础|零基础学习资料 提取码:k7a1 目录: 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  3. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  4. 好书推荐---Python网络编程基础

    Python网络编程基础详细的介绍了网络编程的相关知识,结合python,看起来觉得很顺畅!!!

  5. Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|

    点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...

  6. 第九章:Python の 网络编程基础(一)

    本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...

  7. python网络编程基础

    一.客户端/服务器架构 网络中到处都应有了C/S架构,我们学习socket就是为了完成C/S架构的开发. 二.scoket与网络协议 如果想要实现网络通信我们需要对tcpip,http等很多网络知识有 ...

  8. 第三模块:面向对象&网络编程基础 第2章 网络编程

    01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...

  9. 第十一章:Python の 网络编程基础(三)

    本課主題 多线程的创建和使用 消息队列的介绍 Python 操作 memached 和 redis 实战 本周作业 消息队列的介绍 对列是在内存中创建的,如果整个进程里的程序运行完毕之后会被清空,消息 ...

随机推荐

  1. webstrom如何配置babel来转换es6

    网上有很多关于如何设置babel的.我学习着设置,但总差那么几步,没能满足我的需求. 我使用的是webStorm2017.1版本. babel安装准备 使用webStorm自带的filewatcher ...

  2. Android 使用CheckBox实现多选效果

    CheckBox:复选框1.有两种状态: 选中状态(true),未选中状态(false)2.属性: android:id="@+id/checkbox" android:layou ...

  3. JSON.parse()和JSON.stringfy()

    JSON.parse()从字符串中解析出JSON对象: var data = '{"a":1,"b":2}'; JSON.parse(data); JSON.s ...

  4. 原来 CSS 与 JS 是这样阻塞 DOM 解析和渲染的

    hello~各位亲爱的看官老爷们大家好.估计大家都听过,尽量将CSS放头部,JS放底部,这样可以提高页面的性能.然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其然而不知其所以然,强行背下来应付 ...

  5. poj_2553 强连通分支&出度为0的点

    题目大意 N个点的有向图中,定义“好点”为: 从该点v出发可以到达的所有点u,均有一条路径使得u可达v. 求出图中所有的“好点”,并按照顺序从小到大输出出来. 题目分析 图存在多个强连通分支,强连通分 ...

  6. java基础---->多线程之Runnable(一)

    java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...

  7. 微信小程序 --- 获取当前坐标

    获取位置:get.location type:wgs84(是全球定位系统,获取的坐标,gcj02是国家测绘局给出的坐标) btnclick:function(){ wx.getLocation({ t ...

  8. MariaDB登陆

    设置root密码 “mariabd”是新密码 [root@master /]# mysqladmin -u root password mariadb [root@master /]# mysql - ...

  9. 输入一个网站地址到网站展现的过程以及APR协议(鬼知道中间经历了什么)

    以前只知道输入一个网站,然后看着返回琳琅满目的内容,其实中间经历的过程和步骤太多了.为了满足好奇心以及学习需要,特查阅了资料将其记录下来以备后续自己复习. 从我在地址栏输入www.zhihu.com ...

  10. 从零打造在线网盘系统之Struts2框架核心功能全解析

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...