50 votes

Comment validez-vous qu'une chaîne est une adresse IPv4 valide en C ++?

Je n'ai pas besoin de valider que l'adresse IP est accessible ou quelque chose comme ça. Je veux juste valider que la chaîne est au format IPv4 quadruple pointillé (xxx.xxx.xxx.xxx), où xxx est compris entre 0 et 255.

57voto

Raymond Martineau Points 2597

Vous voulez probablement l' inet_pton - qui renvoie -1 en cas d'échec et prend en charge à la fois les adresses IPv4 et futures IPv6. Si vous devez encore écrire votre propre système d'adresse IP, n'oubliez pas qu'un nombre hexadécimal standard de 32 bits est une adresse IP valide mais pas en notation décimale à points.

Cette fonction vérifie à la fois l'adresse et vous permet également d'utiliser la même adresse dans les appels de socket associés.

49voto

Björn Pollex Points 41424

Boost.Asio fournit la classe ip :: address . Si vous voulez juste vérifier la chaîne, vous pouvez l'utiliser comme ceci:

 std::string ipAddress = "127.0.0.1";
boost::system::error_code ec;
boost::asio::ip::address::from_string( ipAddress, ec );
if ( ec )
    std::cerr << ec.message( ) << std::endl;
 

Cela fonctionne également pour les quads hexadécimaux et octaux. Il s'agit également d'une solution beaucoup plus portable.

43voto

Bill the Lizard Points 147311

La solution sur laquelle je me suis installé était:

 bool Config::validateIpAddress(const string &ipAddress)
{
    struct sockaddr_in sa;
    int result = inet_pton(AF_INET, ipAddress.c_str(), &(sa.sin_addr));
    return result != 0;
}
 

Cela fonctionne pour la plupart des cas mentionnés dans d'autres réponses. Il ne reconnaît pas les adresses IP au format octal ou hexadécimal, mais cela est acceptable pour mon application.

17voto

Mihai Limbășan Points 17205

Cela ressemble étonnamment simple mais a quelques pièges. Par exemple, beaucoup de solutions postées dans les réponses précédentes supposent que les quads sont en base 10, mais un quad en commençant par un zéro doit être traitée comme une base 8 (octal) nombre, d'où, par exemple, quad partie à partir de zéro et contenant les chiffres 8 ou 9 n'est pas valide. I. e, le numéro IP 192.168.1.010 est pas 192.168.1.10 mais en réalité est - 192.168.1.8, et la propriété intellectuelle nombre 192.168.019.14 n'est pas valide depuis le troisième quad contient les invalides de la base de 8 chiffre 9.

J'ai catégoriquement vous encourageons à utiliser les fonctions fournies par la bibliothèque de socket inclus dans votre système d'exploitation ou le compilateur de l'environnement.

Edit: (Pensé que c'était implicite, mais bien entendu, vous pouvez également avoir hexadécimal quads, à la 192.168.1.0x0A pour 192.168.1.10, et bien sûr, vous pouvez mélanger et assortir à votre sadique contenu joyeusement en utilisant les majuscules et les minuscules, à la 0xC0.0xa8.1.010 pour 192.168.1.8. Essayez quelques exemples à l'aide de ping si vous voulez avoir du plaisir. Cela fonctionne bien croix-plate-forme (testé un temps, tout en jurant sous Linux, NetBSD, et Win32.)

Modifier en réponse à KaluSingh Gabbar de la demande: Par exemple, vous pouvez spécifier 192.168.1.10 comme 0xc0a8010a et il représente encore un numéro IP, à la:

[mihailim@home ~]$ ping 0xc0a8010a
PING 0xc0a8010a (192.168.1.10) 56(84) bytes of data.
^C
--- 0xc0a8010a ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2479ms

8voto

Steve Points 615

Voici une méthode simple.

 bool IsIPAddress(std::string & ipaddr)
    {    

    StringTokenizer quads(ipaddr,".");

    if (quads.countTokens() != 4) return false;

    for (int i=0; i < 4; i++)
      {
      std::string quad = quads.nextToken();
      for (int j=0; j < quad.length(); j++
         if (!isdigit(quad[j])) return false;

      int quad = atoi(quads.GetTokenAt(i));
      if (quad < 0) || (quad > 255)) return false;
      }

    return true;
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X