Tengo problemas para encontrar un método rápido y efectivo para determinar el rango de IP válido según la IP y la máscara de red del enrutador.
Sé cómo calcular la IP de la subred y la IP de transmisión convirtiendo toda la IP y la máscara de red a binaria y haciendo Y/O bit a bit, pero ese enfoque lleva mucho tiempo y fácilmente conducirá a errores garrafales...
Respuesta1
Existen varios sitios web y aplicaciones que harán el cálculo por usted, comohttp://www.subnet-calculator.com/cidr.php.
De lo contrario, utilice la máscara de red para calcular el tamaño de la subred (2 elevado a la potencia del número de bits cero en la máscara de red). Encuentre la dirección IP más alta que sea un múltiplo exacto del tamaño de la subred pero que sea menor que la dirección IP del enrutador. Esa dirección IP es la dirección de red y la dirección IP más el tamaño de la subred menos 1 es la dirección de transmisión.
Respuesta2
Si algo lleva tiempo, escribe un guión.
Python tiene el ipaddress
módulo:
$ python
Python 3.4.2 (default, Oct 8 2014, 13:44:52)
>>> import ipaddress
>>> x = ipaddress.IPv6Interface("2001:470:709a:107::1a2b:3c/64")
>>> x.network
IPv6Network('2001:470:709a:107::/64')
>>> y = ipaddress.IPv4Interface("194.219.181.195/26")
>>> y.network
IPv4Network('194.219.181.192/26')
>>> y.network.network_address
IPv4Address('194.219.181.192')
>>> y.network.broadcast_address
IPv4Address('194.219.181.255')
Lo que daría como resultado:
#!/usr/bin/env python
import ipaddress
import sys
for arg in sys.argv[1:]:
addr = ipaddress.ip_interface(arg)
print("address =", addr)
print("network =", addr.network)
if addr.version == 4:
print("netmask =", addr.netmask)
print("broadcast =", addr.network.broadcast_address)
print()