执行基本查询
最基本的查询就是正向查询,它根据一个主机名来查找ip地址。
getaddrinfo(...)
getaddrinfo(host, port [, family, socktype, proto, flags])
-> list of (family, socktype, proto, canonname, sockaddr)
Resolve host and port into addrinfo struct.
#根据给定的参数host/port,相应的转换成一个包含用于创建socket对象的五元组,
#参数host为域名,以字符串形式给出代表一个IPV4/IPV6地址或者None.
#参数port如果字符串形式就代表一个服务名,比如“http”"ftp""email"等,或者为数字,或者为None
#参数family为地主族,可以为AF_INET ,AF_INET6 ,AF_UNIX.
#参数socketype可以为SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)
#参数proto通常为0可以直接忽略
#参数flags为AI_*的组合,比如AI_NUMERICHOST,它会影响函数的返回值
#附注:给参数host,port传递None时建立在C基础,通过传递NULL。
#该函数返回一个五元组(family, socktype, proto, canonname, sockaddr),同时第五个参数sockaddr也是一个二元组(address, port)
In [30]: m = socket.getaddrinfo("www.qq.com", None)
In [31]: m //函数返回一个由元组组成的列表
Out[31]:
[(2, 1, 6, '', ('14.17.32.211', 0)),
(2, 2, 17, '', ('14.17.32.211', 0)),
(2, 3, 0, '', ('14.17.32.211', 0)),
(2, 1, 6, '', ('59.37.96.63', 0)),
(2, 2, 17, '', ('59.37.96.63', 0)),
(2, 3, 0, '', ('59.37.96.63', 0)),
(2, 1, 6, '', ('14.17.42.40', 0)),
(2, 2, 17, '', ('14.17.42.40', 0)),
(2, 3, 0, '', ('14.17.42.40', 0)),
(10, 1, 6, '', ('240e:ff:f040:28::a', 0, 0, 0)),
(10, 2, 17, '', ('240e:ff:f040:28::a', 0, 0, 0)),
(10, 3, 0, '', ('240e:ff:f040:28::a', 0, 0, 0))]
In [32]: m[4][4] //只选择ip地址
Out[32]: ('59.37.96.63', 0)
In [33]: m[4][4][0] //注意这个ip时字符串
Out[33]: '59.37.96.63'
执行反向查询,有ip地址查找响应的主机名:
gethostbyaddr(...)
gethostbyaddr(host) -> (name, aliaslist, addresslist)
Return the true host name, a list of aliases, and a list of IP addresses,
for a host. The host argument is a string giving a host name or IP number.
反向查找的真实性检查:
检查的方法就是首先根据ip查找出一个域名。
然后再根据这个域名查找出一个ip列表。
最后检查你所用ip是否再ip列表里面。