Friday, 19 December 2008

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;

0 comments:

Post a Comment