Как определить, входит IP в диапазон по маске?

dimases

Новичок
Как определить, входит IP в диапазон по маске?

Есть список подсетей в виде:
4.79.248.0/24
8.5.246.0/25
8.5.246.128/25
8.8.64.0/24
38.229.0.0/16

Как понять, входит ли IP в диапазон каждой подсети или нет? Циклы опускаем, главное как проверить, входит ли, например, 38.229.2.4 в 38.229.0.0/16?

-~{}~ 11.03.10 12:59:

Короче, нашел сам и решил:
PHP:
<?
function test_IP($ip,$mask){
  $mask = split('/', $mask);
  $start = sprintf('%u', ip2long($mask[0]));
  $end = $start + pow(2, 32-$mask[1]) - 1;

  $my_ip2long = @ip2long($ip);

  if ($my_ip2long >= @ip2long($start) && $my_ip2long <= @ip2long($end)) return true;
    else return false;
}

echo test_IP("217.118.193.200","217.118.66.0/17");
?>
 

antson

Новичок
Партнер клуба
dimases
упускаешь
It is a common practice, to use ip2long() function for getting integer-representation of ip-address (for database-storage). Problem: on systems with 32-bit integers, ip2long() returns values from -2147483648 to 2147483647 on systems with 64-bit integers, ip2long() returns values from 0 to 42949672945
 

dr-sm

Новичок
по идее как-то так надо:
PHP:
      $ip_dec = (float)sprintf("%u",ip2long($ip));
 

dimases

Новичок
Автор оригинала: antson
dimases
упускаешь
It is a common practice, to use ip2long() function for getting integer-representation of ip-address (for database-storage). Problem: on systems with 32-bit integers, ip2long() returns values from -2147483648 to 2147483647 on systems with 64-bit integers, ip2long() returns values from 0 to 42949672945
А какая разница? Главное чтоб в диапазон попадало бы. А какой он - не важно, так?
 

fixxxer

К.О.
Партнер клуба
Если не гонять сериализованные данные между 32 и 64 битными платформами, то из самых общих соображений пофигу.

UPD: Упс - не заметил, что тут сравннение больше-меньше, а не двоичный and. Тут возможны проблемы, хотя конечно врядли надо сравнивать сетки типа /1 :) А зачем так?
 

antson

Новичок
Партнер клуба
вообще у тебя расчет неправильный
Адрес: 217.118.66.0 11011001.01110110.01000010.00000000
Сетевая маска: 255.255.128.0 = 17 11111111.11111111.10000000.00000000

Сеть: 217.118.0.0/17 11011001.01110110.00000000.00000000
Минимальный IP: 217.118.0.1 11011001.01110110.00000000.00000001
Максимальный IP: 217.118.127.254 11011001.01110110.01111111.11111110
Broadcast: 217.118.127.255 11011001.01110110.01111111.11111111
Число хостов: 32766

а теперь 217.118.0.2 у тебя в сеть не попадает
 

dimases

Новичок
Автор оригинала: fixxxer
Если не гонять сериализованные данные между 32 и 64 битными платформами, то из самых общих соображений пофигу.

UPD: Упс - не заметил, что тут сравннение больше-меньше, а не двоичный and. Тут возможны проблемы, хотя конечно врядли надо сравнивать сетки типа /1 :) А зачем так?
Ну а тогда как правильно? Я просто раньше с этим не сталкивался, просто нашел пример в гугле.
 

dimagolov

Новичок
это что, только я знаю, что принадлежность к сети проверяется так:

net & mask == ip & mask

?
 

dimagolov

Новичок
SiMM, можно, но это еще менее очевидно для людей, которые не знакомы с битовыми операциями.
 
Сверху