2012-03-15 39 views
7

可能重复:
How can I check if an ip is in a network in pythonPython - ip <->子网?

什么是最简单的方式,以匹配子网在Python一个IP地址,因此,如果IP地址所在的子网我可以选择呢?

在此先感谢。

+1

这真的不清楚你在问什么。你选择什么,IP或子网?问题是“如何知道IP地址是否在特定的子网中?”或者是什么? – 2012-03-15 09:41:26

回答

16

在Python 3.3+,您可以使用ipaddress模块:

>>> import ipaddress 
>>> ipaddress.ip_address('192.0.43.10') in ipaddress.ip_network('192.0.0.0/16') 
True 

如果你的Python安装比3.3老,你可以使用this backport


如果要评估很多IP地址这种方式,你可能要计算的网络掩码前期,像

n = ipaddress.ip_network('192.0.0.0/16') 
netw = int(n.network_address) 
mask = int(n.netmask) 

然后,对于每个地址,计算二进制与

a = int(ipaddress.ip_address('192.0.43.10')) 
a = struct.unpack('!I', socket.inet_pton(socket.AF_INET, '192.0.43.10'))[0] 
a = struct.unpack('!I', socket.inet_aton('192.0.43.10'))[0] # IPv4 only 

最后一个代表,你可以简单地检查:

in_network = (a & mask) == netw 
+0

无论如何要做到这一点更有效地为一组巨大的表?恩。我有一个约10万个这样的表格:) – 2012-11-30 18:20:19

+0

@EiyrioüvonKauyf更新了该案例的答案。 – phihag 2012-11-30 18:43:31

+0

非常感谢:) – 2012-11-30 21:03:33

2

如果对于给定的IP,您希望从长长的前缀列表中找到前缀,那么您可以实现longest prefix match。你首先从你的前缀列表中建立一个prefix tree,然后你遍历树寻找最匹配你的前缀的树叶。

这听起来很可怕,但它不是很差:)

相关问题