Contrôler la validité d'une chaine représentant une adresse IP



Voici une fonction qui permet de contrôler qu'une chaine représente une adresse IP valide. A noter que seule la représentation est testée, en aucun cas il n'y a vérification de l'existence physique de l'adresse sur le réseau.


Fonction de contrôle d'IP

(**
 * Contrôle la chaine représente une adresse IP valide
 * @param IP la chaine contenant l'adresse IP
 * @return true si l'IP est valide
 **)
function CheckIp(const Ip: String): Boolean;
var
  i: Integer;       // Indice de parcours de la chaine
  c: Char;          // Caractère en cours dans la chaine
  NbChars: Integer; // Nombre de caractères composant le nombre
  Dots: Integer;    // Nombre de points dans la chaine
  Number: Integer;  // Valeur du nombre en cours 
begin
  // Si la chaine est vide, l'IP est invalide
  Result := false;
  if (Length(Ip) = 0) then exit;
  // On initialise les valeurs
  Number := 0;
  Dots := 0;
  NbChars := 0;
  // Pour chaque caractère de la chaine
  for i := 1 to Length(Ip) do
    begin
      c := Ip[i];
      // S'il s'agit d'un point, on incrémente le compteur
      // de points
      if (c = '.') then
        begin
          // Si la chaine commence par un point, alors l'IP
          // n'est pas valide
          if (NbChars = 0) then exit;
          NbChars := 0;
          Number := 0;
          inc(Dots);
          // Il ne peut y avoir plus de 3 points dans une IP
          if (Dots > 3) then exit;
        end
      else
        begin
          // S'il ne s'agit pas d'un nombre, on sort également
          if ((c < '0') or (c > '9')) then exit;
          // On ajoute la valeur du caractère au nombre
          Number := Number * 10 + (Ord(c) - Ord('0'));
          Inc(NbChars);
          // S'il y a plus de 3 caractères, la chaine n'est 
          // pas valide
          if (Boolean(NbChars shr 2)) then exit;
          // Si le nombre dépasse 255, la chaine n'est pas
          // valide non plus
          if (Boolean(Number shr 8)) then exit;
        end;
    end;
  // S'il n'y a aucun caractère dans le dernier nombre, la
  // chaine n'est pas valide
  if (NbChars = 0) then exit;
  // Si on est arrivé jusqu'ici, c'est que l'IP est valide
  Result := true;
end;


3 requête(s) SQL executée(s) en 0.000 Secs - Temps total de génération de la page : 0.006 Secs