2017-04-08 44 views
1

我有一个IPv4地址。防爆。 172.19.20.21检查IPv4/IPv6地址是否使用PHP

我用来做这

$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的其他解决方案?

+0

如果你100%确定你在'$ ip_address'中得到的是IP,这将只区分v4和v6。如果这对你很好,那么这应该工作。 – apokryfos

+2

你的'if'和'else'块是完全相同的,所以你基本上说“如果我不改变我的代码,它是否适用于IPv6?”我的回答是,“你试过了吗?” – IMSoP

回答

1

的内建的方法来解析IP地址为inet_pton()

此功能的人类可读的IPv4或IPv6地址(如PHP 与IPv6支持内置启用)转换成地址族 合适的32位或128bit二进制结构。

要确定的格式就可以了,例如,计算所得的字节:

strlen(inet_pton($ip)) 
4 bytes = 32 bits = IPv4 
16 bytes = 128 bits = IPv6 

(在您的精确使用情况下,虽然,它是一种目前还不清楚为什么你需要这在第一个地方)。