如果我使用sr1发送一个关于www.google.com的DNSQR请求,我会得到多个DNSRR响应,例如(使用ans[DNSRR].show()
实现):
###[ DNS Resource Record ]###
rrname= 'www.google.com.'
type= A
rclass= IN
ttl= 294
rdlen= 4
rdata= '173.194.35.176'
###[ DNS Resource Record ]###
rrname= 'www.google.com.'
type= A
rclass= IN
ttl= 294
rdlen= 4
rdata= '173.194.35.178'
###[ DNS Resource Record ]###
....
有没有一种简洁的方法来遍历这些DNSRR?我目前使用正则表达式和以下代码:
def get_ip_addr(s):
pattern = r'[0-9]+(?:\.[0-9]+){3}'
match = re.search(pattern, s)
if match:
return match.group()
return None
def resolve_host(host, nserver):
print "resolving host: " + host + " (using nserver: " + nserver + ")"
dns_pkt = IP(dst=nserver)/UDP()/DNS(rd=1, qd=DNSQR(qname=host))
ans = sr1(dns_pkt)
if ans:
print "IP(s) for %s:" % (host)
dnsrr_strings = repr(ans[DNSRR]).split("|")
for dnsrr in dnsrr_strings :
ip_addr = get_ip_addr(dnsrr)
if ip_addr:
print " %s" % ip_addr
else:
sys.stderr.write("unable to lookup " + host)