Задать вопрос
Exileum
@Exileum
PHP-программист

Проверка вхождения диапазона IP- адресов в другой диапазон IP-адресов на PHP?

Доброго времени суток.



Потребовалось реализовать такую вещь: есть пул адресов, из него выделяются клиентские адреса с различными масками. Задача выделять IP-адреса не допуская особой фрагментации (IP могут возвращаться от клиентов). Как при выделении диапазона проверить, не пересекается ли он с ранее выданными диапазонами?



Достаточно легко проверить вхождение IP-адреса в диапазон адресов, в интернете много примеров найти по данному вопросу можно, но вот логику скрипта для проверки, например, следующей ситуации: входит ли в диапазон 192.168.0.0/16 другой, более маленький диапазон 192.168.1.0/30 — продумать не могу.



Может ли кто-нибудь посоветовать варианты решения данной проблемы?
  • Вопрос задан
  • 11705 просмотров
Подписаться 6 Оценить Комментировать
Решения вопроса 1
Riateche
@Riateche
1. Преобразуем ip в числа с помощью ip2long. Имеем нижние границы диапазонов.
2. Вычисляем число адресов в диапазоне по формуле 2^(32-x), x — последняя цифра в обозначении подсети.
3. Прибавляем к нижней границе число адресов, получаем верхнюю границу (не включительно).
4. Сравниваем границы диапазонов как числа, проверяем вхождение первого диапазона во второй.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Ilya_Drey
@Ilya_Drey
Переводите сеть и маску в двоичный формат и смотрите.
Из вашего примера:

Network: 192.168.0.0/16 11000000.10101000.00000000.00000000
Netmask: 255.255.0.0 11111111.11111111.00000000.00000000
Network: 192.168.1.0/30 11000000.10101000.00000001.00000000
Netmask: 255.255.255.252 11111111.11111111.11111111.11111100

Соответственно да 192.168.1.0/30 входит в 192.168.0.0/16, а 192.169.0.0/30 не входит:

Network: 192.169.0.0/16 11000000.10101001.00000000.00000000
Netmask: 255.255.0.0 11111111.11111111.00000000.00000000
Ответ написан
@zloyshaman
Диапазоны ведь непрерывны? Проверяете первый и последний одного IP диапазона на вхождение в другое диапазон. Потом наоборот.
Ответ написан
opium
@opium
Просто люблю качественно работать
В пхп есть стандартные функции работы с ip диапозонами, поищите в справочнике по ip? выше уже упоминаль ip2long
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы