Многие ищут/спрашивают функции для проверок IP-адресов на вхождение в подсеть, итак:
Perl
#!/usr/bin/perl # Пример вызова и проверки IP-адреса 192.168.0.4 # на принадлежность к сети 192.168.0.0 с маской 255.255.255.248 # if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){ print "Адрес принадлежит сети\n"; }else{ print "Адрес не входит в подсеть\n"; } #Подпрограмма перевода IP в число sub aton{ my $addr=shift; (my $a0, my $a1, my $a2, my $a3)=split('\.',$addr); return $a3+($a2<<8)+($a1<<16)+($a0<<24); } #Подпрограмма перевода числа в IP sub ntoa{ my $ip=shift; return sprintf("%d.%d.%d.%d", (($ip&0xFF000000)>>24),(($ip&0xFF0000)>>16),(($ip&0xFF00)>>8),($ip&0xFF)); }
#Подпрограмма проверки вхождения IP в подсеть
sub ip_vs_net{
my $ip=shift;
my $network=shift;
my $mask=shift;
if((aton($ip)&aton($mask))==aton($network)){
return 1;
}else{
return 0;
}
}
PHP
<?
// Пример вызова и проверки IP-адреса 192.168.0.4
// на принадлежность к сети 192.168.0.0 с маской 255.255.255.248
if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
print "Адрес принадлежит сети<BR>";
}else{
print "Адрес не входит в подсеть<BR>";
}
function ip_vs_net($ip,$network,$mask){
if (((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
return 1;
}else{
return 0;
}
}
?> Функции которые переводят из CIDR в обычную маску и наоборот <? function cidr_2_mask($mask){ return long2ip(pow(2,32) - pow(2, (32-$mask))); } function mask_2_cidr($mask){ $a=strpos(decbin(ip2long($mask)),"0"); if (!$a){$a=32;} return $a; } ?> Пример: <? printf("%s",cidr_2_mask("24")); //Напечает 255.255.255.0 printf("%s",mask_2_cidr("255.255.255.0")); //Напечает 24 ?>
Ссылки:
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !