11.4 通过CIDR地�生�对应的IP地�集¶
问题¶
ä½ æœ‰ä¸€ä¸ªCIDR网络地å�€æ¯”如“123.45.67.89/27â€�ï¼Œä½ æƒ³å°†å…¶è½¬æ�¢æˆ�它所代表的所有IP (比如,“123.45.67.64â€�, “123.45.67.65â€�, …, “123.45.67.95â€�))
解决方案¶
å�¯ä»¥ä½¿ç”¨ ipaddress 模å�—å¾ˆå®¹æ˜“çš„å®žçŽ°è¿™æ ·çš„è®¡ç®—ã€‚ä¾‹å¦‚ï¼š
>>> import ipaddress
>>> net = ipaddress.ip_network('123.45.67.64/27')
>>> net
IPv4Network('123.45.67.64/27')
>>> for a in net:
... print(a)
...
123.45.67.64
123.45.67.65
123.45.67.66
123.45.67.67
123.45.67.68
...
123.45.67.95
>>>
>>> net6 = ipaddress.ip_network('12:3456:78:90ab:cd:ef01:23:30/125')
>>> net6
IPv6Network('12:3456:78:90ab:cd:ef01:23:30/125')
>>> for a in net6:
... print(a)
...
12:3456:78:90ab:cd:ef01:23:30
12:3456:78:90ab:cd:ef01:23:31
12:3456:78:90ab:cd:ef01:23:32
12:3456:78:90ab:cd:ef01:23:33
12:3456:78:90ab:cd:ef01:23:34
12:3456:78:90ab:cd:ef01:23:35
12:3456:78:90ab:cd:ef01:23:36
12:3456:78:90ab:cd:ef01:23:37
>>>
Network 也å…�许åƒ�æ•°ç»„ä¸€æ ·çš„ç´¢å¼•å�–值,例如:
>>> net.num_addresses
32
>>> net[0]
IPv4Address('123.45.67.64')
>>> net[1]
IPv4Address('123.45.67.65')
>>> net[-1]
IPv4Address('123.45.67.95')
>>> net[-2]
IPv4Address('123.45.67.94')
>>>
å�¦å¤–ï¼Œä½ è¿˜å�¯ä»¥æ‰§è¡Œç½‘络æˆ�员检查之类的æ“�作:
>>> a = ipaddress.ip_address('123.45.67.69')
>>> a in net
True
>>> b = ipaddress.ip_address('123.45.67.123')
>>> b in net
False
>>>
一个IP地�和网络地�能通过一个IP接��指定,例如:
>>> inet = ipaddress.ip_interface('123.45.67.73/27')
>>> inet.network
IPv4Network('123.45.67.64/27')
>>> inet.ip
IPv4Address('123.45.67.73')
>>>
讨论¶
ipaddress 模�有很多类�以表示IP地��网络和接�。
å½“ä½ éœ€è¦�æ“�作网络地å�€ï¼ˆæ¯”如解æž�ã€�打å�°ã€�验è¯�ç‰ï¼‰çš„æ—¶å€™ä¼šå¾ˆæœ‰ç”¨ã€‚
�注�的是,ipaddress 模�跟其他一些和网络相关的模�比如 socket 库交集很少。
æ‰€ä»¥ï¼Œä½ ä¸�能使用 IPv4Address 的实例æ�¥ä»£æ›¿ä¸€ä¸ªåœ°å�€å—ç¬¦ä¸²ï¼Œä½ é¦–å…ˆå¾—æ˜¾å¼�的使用 str() 转æ�¢å®ƒã€‚例如:
>>> a = ipaddress.ip_address('127.0.0.1')
>>> from socket import socket, AF_INET, SOCK_STREAM
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.connect((a, 8080))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'IPv4Address' object to str implicitly
>>> s.connect((str(a), 8080))
>>>
更多相关内容,请�考 An Introduction to the ipaddress Module