Skip to content

Instantly share code, notes, and snippets.

@fanzeyi
Created March 13, 2012 07:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fanzeyi/2027391 to your computer and use it in GitHub Desktop.
Save fanzeyi/2027391 to your computer and use it in GitHub Desktop.
dns_resolve
import os
import re
import socket
import struct
def dns_resolve(host, dnsserver):
assert isinstance(host, basestring) and isinstance(dnsserver, basestring)
index = os.urandom(2)
hoststr = ''.join(chr(len(x))+x for x in host.split('.'))
data = '%s\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00%s\x00\x00\x01\x00\x01' % (index, hoststr)
data = struct.pack('!H', len(data)) + data
address_family = {True:socket.AF_INET6, False:socket.AF_INET}[':' in dnsserver]
sock = None
try:
sock = socket.socket(family=address_family)
sock.connect((dnsserver, 53))
sock.sendall(data)
rfile = sock.makefile('rb')
size = struct.unpack('!H', rfile.read(2))[0]
data = rfile.read(size)
iplist = re.findall('\xC0.\x00\x01\x00\x01.{6}(.{4})', data)
return ['.'.join(str(ord(x)) for x in s) for s in iplist]
except Exception, e:
raise
finally:
if sock:
sock.close()
print dns_resolve('www.youtube.com', '8.8.8.8')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment