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.
Réponses
Trop de publicités?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.
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.
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.
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
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;
}