У меня возникли проблемы с поиском быстрого/эффективного метода определения допустимого диапазона IP-адресов на основе заданного IP-адреса маршрутизатора и маски сети.
Я знаю, как вычислить IP-адрес подсети и широковещательный IP-адрес, преобразовав все IP-адреса и маску сети в двоичный код и выполнив побитовые операции И/ИЛИ, но такой подход занимает много времени и легко может привести к ошибкам...
решение1
Существуют различные веб-сайты и приложения, которые выполнят расчеты за вас, например:http://www.subnet-calculator.com/cidr.php.
В противном случае используйте сетевую маску для вычисления размера подсети (2 в степени числа нулевых бит в сетевой маске). Найдите наибольший IP-адрес, который является точным кратным размеру подсети, но меньше IP-адреса маршрутизатора. Этот IP-адрес является сетевым адресом, а IP-адрес плюс размер подсети минус 1 является широковещательным адресом.
решение2
Если что-то требует времени, запишите это в сценарий.
В Python есть ipaddress
модуль:
$ 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')
Что приведет к:
#!/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()