Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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
使用PHP检查IPv4/IPv6地址是否已打开_Php_Linux_Ping_Ipv6_Ipv4 - Fatal编程技术网

使用PHP检查IPv4/IPv6地址是否已打开

使用PHP检查IPv4/IPv6地址是否已打开,php,linux,ping,ipv6,ipv4,Php,Linux,Ping,Ipv6,Ipv4,我有一个IPv4地址。例如172.19.20.21 我过去常这样做 $fs = @fsockopen($ip,$port,$errno,$errstr,3); if( !$fs ){ $error = 'SSC is down'; return Redirect::to('/')->with('error', $error ) ->withInput(Request::except('password')); } 它工作得非常好 现在,我有一个IPv6地址,例如3000

我有一个IPv4地址。例如
172.19.20.21

我过去常这样做

$fs = @fsockopen($ip,$port,$errno,$errstr,3);
if( !$fs ){
  $error = 'SSC is down';
  return Redirect::to('/')->with('error', $error )
  ->withInput(Request::except('password'));
}
它工作得非常好

现在,我有一个IPv6地址,例如
3000::1

if ((strpos($ip, ":") > -1)){

     // Code for IPv6 check
    $fs = @fsockopen($ip,$port,$errno,$errstr,3);
    if( !$fs ){
      $error = 'SSC is down';
      return Redirect::to('/')->with('error', $error )
      ->withInput(Request::except('password'));
    }

}else{

    // Code for IPv4 check
    $fs = @fsockopen($ip,$port,$errno,$errstr,3);
    if( !$fs ){
      $error = 'SSC is down';
      return Redirect::to('/')->with('error', $error )
      ->withInput(Request::except('password'));
    }
}

我可以使用上面的代码吗?或者我需要为IPv6寻找其他解决方案?

解析IP地址的内置方法是:

此函数用于转换人类可读的IPv4或IPv6地址(如果是PHP) 已在启用IPv6支持的情况下构建到地址族中 适当的32位或128位二进制结构

例如,要确定格式,可以计算结果字节数:

strlen(inet_pton($ip))
4字节=32位=IPv4
16字节=128位=IPv6

(不过,在您的具体使用案例中,首先不清楚您为什么需要它。)

如果您100%确定,
$ip\u address
中的内容是ip,那么这只会区分v4和v6。如果你同意的话,这应该行得通。你的
If
else
块是相同的,所以你基本上是在说“如果我不更改代码,它是否适用于IPv6?”我的回答是,“你试过了吗?”