Verificar si una IP es correcta

Para verificar si una IP es correcta, he creado una pequeña función que comprueba como esta escrita la IP.

Si tenemos la IP : 89.45.34.80
Primero compruebo que la longitud del texto no sea menor de 7 caracteres o mayor de 15:

X.X.X.X
XXX.XXX.XXX.XXX

Luego busco la posición de los puntos y la guardo en un pequeño array.
Compruebo que la posición de los puntos sea la correcta. Las posibilidades de la posición del punto son:

X. (Pos = 2)
XX. (Pos = 3)
XXX. (Pos = 4)

Estas posiciones son relativas a cada byte de la IP.

Por último, recorto cada byte según la posición relativa del punto y compruebo el valor de cada byte. Para el primer byte los valores posibles van de 1 a 223 y para los siguientes bytes de 0 a 255.

Aquí os dejo el código. (Fletaría implementar el de la máscara que lo único que hay que cambiar es que el primer byte también puede ir de 0 a 255).
Seguro que hay mejores maneras de implementarla, pero las que he visto por ahí dependían de alguna API.



function EsIpCorrecta(ip: string): Boolean;
var
ContarCaracter, i, j, iCount, ipValor, iCorte: integer;
ipSector: array[1..3] of byte;
bIpBuena, bFallo: boolean;
sValor: string;
begin
bIpBuena := false;
if (Length(ip) > 15) or (Length(ip) < 7) then //X.X.X.X o XXX.XXX.XXX.XXX
begin
result := bIpBuena;
exit;
end;

for i := 1 to 3 do
ipSector[i] := 0;
ContarCaracter := 0;
bFallo := false;
i := 1;
j := 1;
while (not bFallo) and (i <= Length(ip)) do
begin
if not (ip[i] in ['0'..'9']) then
begin
if ip[i] = '.' then
begin
inc(ContarCaracter);
if ContarCaracter < 4 then
begin
ipSector[ContarCaracter] := j;
j := 1;
end
else
bFallo := true;
end
else
bFallo := true;
end
else
inc(j);
inc(i);
end;

if (ContarCaracter <> 3) or bFallo then
begin
result := bIpBuena;
exit;
end;

for i := 1 to 3 do //X. XX. XXX.
if (ipSector[i] < 1) or (ipSector[i] > 4) then
begin
result := bIpBuena;
exit;
end;

iCorte := 0;
iCount := 0;
i := 1;
while (not bFallo) and (i <= 4) do
begin
if i <> 4 then
iCount := ipSector[i]
else
iCount := Length(ip) - iCorte + 1;
sValor := AnsiLeftStr(AnsiRightStr(ip, Length(ip) - iCorte), iCount - 1);
ipValor := StrToInt(sValor);
if i = 1 then
begin
if (ipValor > 223) or (ipValor = 0) then //Primer valor de 1 a 223
bFallo := true;
end
else if (ipValor > 255) then //Otros valores de 0 a 255
bFallo := true;
iCorte := iCorte + Length(sValor) + 1;
inc(i);
end;

bIpBuena := not bFallo;
result := bIpBuena;
end;

Comments

Popular Posts