当前位置: 首页 > 面试题库 >

将IP与PHP 5中的CIDR掩码匹配?

靳富
2023-03-14
问题内容

我正在寻找一种将给定IP4点缀四边形IP与CIDR表示掩码匹配的快速/简单方法。

我有一堆IP,我需要查看它们是否与IP范围匹配。

例:

$ips = array('10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4');

foreach ($ips as $IP) {
    if (cidr_match($IP, '10.2.0.0/16') == true) {
        print "you're in the 10.2 subnet\n"; 
    }
}

会是什么cidr_match()模样?

它并不一定必须很简单,但是快速就可以了。仅使用内置/通用功能的任何东西都是一种奖励(因为我很可能会让一个人向我展示梨子中的某些东西,但这样做我不能依赖于梨子或该软件包安装在我的代码所在的位置)部署)。


问题答案:

如果仅使用IPv4:

  • 用于ip2long()将IP和子网范围转换为长整数
  • 将/ xx转换为子网掩码
  • 进行按位“与”(即ip和mask)并检查“结果=子网”

这样的事情应该工作:

function cidr_match($ip, $range)
{
    list ($subnet, $bits) = explode('/', $range);
    if ($bits === null) {
        $bits = 32;
    }
    $ip = ip2long($ip);
    $subnet = ip2long($subnet);
    $mask = -1 << (32 - $bits);
    $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned
    return ($ip & $mask) == $subnet;
}


 类似资料:
  • 问题内容: 我想找到一种方法来执行SQL查询,该查询将计算存储在数据库中的子网掩码的cidr(位表示)。因此,例如,我将255.255.255.0或其十进制值(4294967040)存储在数据库中。我想进行选择并通过查询获取/ 24表示形式。 我已经完成了如下操作来确定子网的最后一个IP,所以我希望做类似的事情来确定掩码的cidr表示形式。 最好是一条可以在mysql,postgres,oracl

  • 问题内容: 在索引中,我有一个IP字段。字段的类型为“ ip”。 我想搜索所有以“ 192.168”开头的IP 我所有的尝试都失败了,并显示以下消息: 无法解析IP [192.168],不是有效的IP地址 有没有办法做到这一点,还是应该将字段的类型更改为“字符串”? 谢谢。 问题答案: 您可以使用范围查询,例如:

  • 问题内容: 给定CIDR地址,例如 如何确定面膜长度?() 如何确定掩码地址?() 如何确定网络地址?() 问题答案: 它由apache utils涵盖。 请参阅以下URL:http : //commons.apache.org/proper/commons- net/apidocs/org/apache/commons/net/util/SubnetUtils.html 注意:对于使用// 32

  • 问题内容: 我有IP地址和掩码,例如。我想检查是否在该范围内。是否存在可以执行此操作的库或实用程序,或者我需要自己写点东西? 问题答案: 首先,您需要将IP地址转换为flat ,这将更易于使用: 一旦您的IP地址为s,就可以执行一些算法来执行检查:

  • 问题内容: 我有一个表,其中包含一列作为CIDR值,例如,我还有其他2列(start_ip_range和end_ip_range),我想填充这2列FROM CIDR列 Java代码可能如下所示: 如何将其转换为MySql查询。 问题答案: 你可以这样转换 询问 样品表 或者,您可以在虚拟列中使用它。因此,您可以直接获得正确的值。 虚拟领域

  • 如何使用postgres查询最小或最大INET/CIDR 但看起来: network_smower(inet,inet)和network_marger(inet,inet) x86_64-redhat-linux-gnu上的PostgreSQL 9.2.15,由gcc(gcc)4.8.5 201 50623(Red Hat 4.8.5-4)编译,64位