2017-04-08 1 views
1

J'ai une adresse IPv4. Ex. 172.19.20.21Vérifiez si l'adresse IPv4/IPv6 est à l'aide de PHP

que je faisais ce

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

Il fonctionne parfaitement bien.

Maintenant, j'ai une adresse IPv6 Ex. 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')); 
    } 
} 

Puis-je utiliser ce code ci-dessus? Ou je dois chercher une autre solution pour IPv6?

+0

Cela ne la différence entre v4 et v6 si vous êtes certain à 100% que ce que vous avez in' ip_address' $ est une adresse IP. Si cela vous convient, cela devrait fonctionner. – apokryfos

+2

Vos blocs 'if' et' else' sont identiques, donc vous dites essentiellement "si je ne change pas mon code, cela fonctionnera-t-il pour IPv6?" A quoi ma réponse est: "l'as-tu essayé?" – IMSoP

Répondre

1

La façon builtin pour analyser une adresse IP est inet_pton():

Cette fonction convertit une IPv4 lisible ou l'adresse IPv6 (si PHP a été compilé avec le support IPv6 activé) dans une famille d'adresse 32bit appropriée ou Structure binaire 128 bits.

Pour déterminer le format que vous pouvez, par exemple, compter les octets obtenus:

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

(Dans votre cas d'utilisation précise, cependant, il est en quelque sorte ne sait pas pourquoi vous en avez besoin dans la premier lieu.)