Python - ip <-> subnet match? [duplicate]

倾然丶 夕夏残阳落幕 提交于 2019-11-29 13:12:52

问题


Possible Duplicate:
How can I check if an ip is in a network in python

What is the easy way to match subnet to an ip address in python, so that if the ip address is in the subnet I can choose it?

Thanks in advance.


回答1:


In Python 3.3+, you can use ipaddress module:

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

If your Python installation is older than 3.3, you can use this backport.


If you want to evaluate a lot of IP addresses this way, you'll probably want to calculate the netmask upfront, like

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

Then, for each address, calculate the binary representation with one of

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

Finally, you can simply check:

in_network = (a & mask) == netw



回答2:


If for a given IP you want to find a prefix from a long list of prefixes, then you can implement longest prefix match. You first build a prefix tree from your list of prefixes, and later, you traverse the tree looking for the furthest leaf that matches your prefix.

It sounds scary, but it is not that bad :)



来源:https://stackoverflow.com/questions/9717089/python-ip-subnet-match

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!