2017-04-08 46 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 

(在您的精確使用情況下,雖然,它是一種目前還不清楚爲什麼你需要這在第一個地方)。