Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果两个IPv6地址相等,如何签入PHP?_Php_Ipv6 - Fatal编程技术网

如果两个IPv6地址相等,如何签入PHP?

如果两个IPv6地址相等,如何签入PHP?,php,ipv6,Php,Ipv6,我想检查IP是否被列入白名单,但IPv6地址可以有不同的表示形式: 例如,2001:0DB8:0:0:1::1是2001:0DB8:0000:0000:0001:0000:0001的缩写形式 因此,字符串比较不起作用。我怎么知道两个地址相等?使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持 使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一

我想检查IP是否被列入白名单,但IPv6地址可以有不同的表示形式:

例如,2001:0DB8:0:0:1::1是2001:0DB8:0000:0000:0001:0000:0001的缩写形式

因此,字符串比较不起作用。我怎么知道两个地址相等?

使用

但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持

使用

但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持

inet\u pton没有去掉带括号的IPv6地址中的括号,这只与非常特定的用例有关:inet\u pton[::1]返回FALSE。这是因为括号内的地址在技术上不是有效的IPv6地址。相反,括号内的地址包含IPv6地址,即使IPv6位于URL中时需要括号

以下是Ipv6唯一的功能:

$bothBracketsArray = array('[', ']');
function are_ipv6_equal($a, $b) {
    global $bothBracketsArray;
    return inet_pton(str_replace($bothBracketsArray, '', $a)) === inet_pton(str_replace($bothBracketsArray, '', $b));
}
$bothBracketsArray是一个全局数组,因此PHP不必每次都分配一个新数组,也不必对其模板进行浅层克隆,也不必像PHP现在所做的那样

我自己的目的还需要比较端口号和处理IPv4,因为我正在监视netstat的输出,以查看哪个进程PID位于套接字的另一侧

$bothBracketsArray = array('[', ']');
function doIpsAndPortsEqual($a, $b) {
    global $bothBracketsArray;
    $lastPosA = strrpos($a, ":"); // port #
    $lastPosB = strrpos($b, ":"); // port #
    if (substr($a, $lastPosA+1) !== substr($b, $lastPosB+1)) return false;
    $ipA = substr($a, 0, $lastPosA);
    $ipB = substr($a, 0, $lastPosB);
    if (strpos($ipA, ':') !== false) { // Ipv6
        return inet_pton(str_replace($bothBracketsArray, '', $ipA)) === inet_pton(str_replace($bothBracketsArray, '', $ipB));
    } else { // Ipv4
        return $ipA === $ipB;
    }
}
inet_pton没有去掉括号中的IPv6地址中的括号,这只对非常特定的用例有影响:inet_pton[::1]返回FALSE。这是因为括号内的地址在技术上不是有效的IPv6地址。相反,括号内的地址包含IPv6地址,即使IPv6位于URL中时需要括号

以下是Ipv6唯一的功能:

$bothBracketsArray = array('[', ']');
function are_ipv6_equal($a, $b) {
    global $bothBracketsArray;
    return inet_pton(str_replace($bothBracketsArray, '', $a)) === inet_pton(str_replace($bothBracketsArray, '', $b));
}
$bothBracketsArray是一个全局数组,因此PHP不必每次都分配一个新数组,也不必对其模板进行浅层克隆,也不必像PHP现在所做的那样

我自己的目的还需要比较端口号和处理IPv4,因为我正在监视netstat的输出,以查看哪个进程PID位于套接字的另一侧

$bothBracketsArray = array('[', ']');
function doIpsAndPortsEqual($a, $b) {
    global $bothBracketsArray;
    $lastPosA = strrpos($a, ":"); // port #
    $lastPosB = strrpos($b, ":"); // port #
    if (substr($a, $lastPosA+1) !== substr($b, $lastPosB+1)) return false;
    $ipA = substr($a, 0, $lastPosA);
    $ipB = substr($a, 0, $lastPosB);
    if (strpos($ipA, ':') !== false) { // Ipv6
        return inet_pton(str_replace($bothBracketsArray, '', $ipA)) === inet_pton(str_replace($bothBracketsArray, '', $ipB));
    } else { // Ipv4
        return $ipA === $ipB;
    }
}