python之ipaddress

ip地址一共32位阿,20的掩码表示使用20位作为网络地址选项,那么就还剩下12位来做主机地址了。粗略就是2^12个主机ip了。 我们通过ipaddress模块,生成类似于”123.45.67.89/27”这样的CIDR(Classless InterDomain Routing)网络地址可表示的全部IP地址范围。

In [1]: import ipaddress

In [2]: net = ipaddress.ip_network('123.45.67.64/27')

In [3]: net
Out[3]: IPv4Network('123.45.67.64/27')

In [4]: for elt in net:
   ...:     print(elt)
   ...:
123.45.67.64
123.45.67.65
123.45.67.66
123.45.67.67
123.45.67.68
123.45.67.69
123.45.67.70
123.45.67.71
123.45.67.72
123.45.67.73
123.45.67.74
123.45.67.75
123.45.67.76
123.45.67.77
123.45.67.78
123.45.67.79
123.45.67.80
123.45.67.81
123.45.67.82
123.45.67.83
123.45.67.84
123.45.67.85
123.45.67.86
123.45.67.87
123.45.67.88
123.45.67.89
123.45.67.90
123.45.67.91
123.45.67.92
123.45.67.93
123.45.67.94
123.45.67.95

In [5]: net.num_addresses
Out[5]: 32

In [6]: net[0]
Out[6]: IPv4Address('123.45.67.64')

In [7]: a = ipaddress.ip_address('123.45.67.69')

In [8]: a in net           #判断ip是否在CIDR中
Out[8]: True

ipaddress模块同其他网络相关的模块比如socket库之间的交互是有局限性的。通常不能用IPv4Address的实例作为地址字符串的替代。必须显式的通过str()将其转换为字符串。