[PHP] Вычесть принадлежность IP к сети

O
На сайте с 29.05.2008
Offline
195
7286

Здравствуйте.

Хочу сделать геотартегинг на сайте. Есть база вида IP(основная сеть)/маска подсети (192.168.137.1/24). Не умею считать :mad: . Если я, например, загружу эту базу в файл (только припустим, конечно, я предварительно все сортирую). Как мне, получив IP пользователя, скажем 192.168.137.22 определить, что он находится в сети 192.168.137.1, залезть в файл и счесть, скажем конфигурацию для этой сети. Надо ли перед этим расписать такое 192.168.137.1/24 на все возможные варианты, или по айпи можно определить основную сеть? Вообщем, помогите. Сломал голову. :o

Что ли формулу хотя бы для расклада ip/mask на ip array дайте, если по айпи нельзя основную сеть считать не имея маски.

P.S. Насколько будет оправдано хранить значения в SQLite? Или лучше все-таки что-то типа json/ini?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Я это делаю примерно так:

Допустим есть сеть

$net=192.168.1.1/22

И есть айпишник

$ip=192.168.2.34

Чтобы проверить принадлежность, делаем так


$ip=ip2long($ip);
list($net,$mask)=explode('/',$net);
$net=ip2long($net);
$mask=pow(2,32-$mask)-1;
$net=$net&~$mask;
if (!(($ip^$net)&~$mask)) { echo "Принадлежит"; } else { echo "Не принадлежит"; }
Лог в помощь!
O
На сайте с 29.05.2008
Offline
195
#2

[umka], спасибо, работает. Но алгоритм не понял.

Что делает это? $mask=pow(2,32-$mask)-1; Т.е. какая формула в целом?

[umka]
На сайте с 25.05.2008
Offline
456
#3
ortegas:
[umka], спасибо, работает. Но алгоритм не понял.
Что делает это? $mask=pow(2,32-$mask)-1; Т.е. какая формула в целом?

Эта "формула" делает из числа, обозначающего количество разрядов, непосредственно маску.

Т.е. у нас есть сеть

192.168.1.1/22, она же 192.168.0.1/22

Т.е. это все айпишники

192.168.0.1 — 192.168.3.255

В двоичном виде, это айпишники:

11000000101010000000000000000001 — 11000000101010000000001111111111

Нам нужно проверить, попадает ли в этот диапазон искомый ip-адрес 192.168.2.34

Это в двоичном виде 11000000101010000000001000100010.

Чтобы проверить принадлежность к сети, нужно проверить, совпадают ли разряды из адреса сети, попадающие под маску, с разрядами искомого ip-адреса, которые попадают под эту же маску.

Маска /22, в нашем случае, это 22 "фиксированных" разряда, т.е.

2^(32-22)-1

В двоичном виде маска:

11111111111111111111110000000000

Т.е. условие, которое производит проверку принадлежности айпишника к сети вот

if (!(($ip^$net)&~$mask)) ...

В нём используются три десятичных числа: айпишник, сеть (по-сути, любой адрес из этой сети) и маска.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий