Python – ip subred match?

Posible duplicado:
¿Cómo puedo verificar si una IP está en una red en Python?

¿Cuál es la manera fácil de hacer coincidir la subred con una dirección IP en Python, de modo que si la dirección IP está en la subred puedo elegirla?

Gracias por adelantado.

En Python 3.3+, puedes usar el módulo ipaddress :

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

Si su instalación de Python es anterior a la 3.3, puede usar este puerto trasero .


Si desea evaluar muchas direcciones IP de esta manera, probablemente querrá calcular la máscara de red por adelantado, como

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

Luego, para cada dirección, calcule la representación binaria con uno de

 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 

Por último, puede simplemente comprobar:

 in_network = (a & mask) == netw 

Si para una IP determinada desea buscar un prefijo de una larga lista de prefijos, entonces puede implementar la coincidencia de prefijo más larga . Primero construyes un árbol de prefijos de tu lista de prefijos, y luego, recorres el árbol buscando la hoja más alejada que coincida con tu prefijo.

Suena aterrador, pero no es tan malo 🙂