1

我有确定一个 IP 是否进入特定 IP 范围的 PHP 函数,但我不知道如何找出 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;
}
}
?>
4

3 回答 3

2

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

于 2010-05-03T23:35:55.373 回答
1

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

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

于 2010-05-03T23:37:41.840 回答
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;
}
于 2010-05-04T01:14:23.237 回答