PHP:检测IP到特定IP范围的进入

时间:2010-05-03 23:31:23

标签: php range ip detect

我有PHP函数来确定一个IP是否进入特定的IP范围,但我不知道如何找到IP的网络和掩码。任何人都可以帮忙吗?

<?
// Example of calling and checking IP-address 192.168.0.4
// belonging to a network 192.168.0.0 with mask 255.255.255.248

if(ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
print "Address belongs to a netwok<BR>";
} else {
print "Address is out of subnetwork's range<BR>";
}

function ip_vs_net($ip,$network,$mask){
if(((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
return 1;
} else {
return 0;
}
}
?>

3 个答案:

答案 0 :(得分:2)

你不能只根据IP找出掩码。您需要知道子网是什么或什么,32个子网中可能存在相同的IP。

答案 1 :(得分:1)

有点但不是真的。您永远不应该关心或不必关心外部网络网络掩码或网络。

但是,如果您是网络内部,并且DHCP服务器可用,则可以通过DHCP协议进行查询以获取内部(本地)网络设置。如果您在局域网中,您还可以使用类似RIP协议的方式与网络设备进行通信。我猜你是不是对使用nmap或某种东西进行某种端口扫描更感兴趣并且对网络不感兴趣...在这种情况下...... FUH:)

答案 2 :(得分:1)

当IP地址是优雅的(A类,B类,C类等)时,很容易找到子网掩码,因为它是固定的,具体取决于地址范围。

现在使用CIDR,无法知道确切的子网掩码,因为任何连续的前缀都可以用作子网掩码。

但是,优雅的子网可能适用于您的情况。这绝对比什么都好。您可以使用此函数找出子网掩码,

function get_net_mask($ip) {
   if (is_string($ip)) {
      $ip = ip2long($ip);
   }
   if (($ip & 0x80000000) == 0) {
       $mask = 0xFF000000;
   } elseif (($ip & 0xC0000000) == (int)0x80000000) {
       $mask = 0xFFFF0000;
   } elseif (($ip & 0xE0000000) == (int)0xC0000000) {
       $mask = 0xFFFFFF00;
   } else {
       $mask = 0xFFFFFFFF;
   }
   return $mask;
}