C/Visual C - Validar Direccion IP en C

 
Vista:

Validar Direccion IP en C

Publicado por luchot (7 intervenciones) el 14/06/2005 18:15:16
hola a todos,

Estoy haciendo un programa en C que debe manejar nros de IP para luego gestionar un firewall con el modulo net_filter del kernel de Linux. Dado que necesito que el mismo sea performante, debo de hacerlo en c para gestionar el uso de memoria y tal.

El problema que tengo es sinceramente muy básico, pero no logro descifrar donde esta el problema....una de las validaciones que debo hacer es la siguiente:

Formato IP válido: n1.n2.n3.n4

Ejemplos: 192.168.0.101, 255.255.255.0, 66.98.151.220, 0.0.0.0, etc

Donde "n1, n2, n3, n4" deben ser menor o igual a 255 (n<=255)

El problema es que el Nro de IP se ingresa por teclado lo almaceno en un array de tipo char, en este caso nuevaIP[15] (16 espacios: 12 para posibles nros, 3 caracteres punto "." y el final de cadena '\n')

He hecho un bucle for donde pregunto por el caracter "." sino lo encuentro debo de almacenar en una variable el primer nro, y asi consecutivamente.

Un ejemplo suponiendo que la cadena ingresada sea "192.98.151.220"

i=0;
char aux;
char trio[3];
while (nuevaIP[i] != '\n') {
charter = ("%c", nuevaIP[i]);
aux= ("%c", nuevaIP[i]);
if (charter != 46) {
// aux se carga con "1", "9", y "2" antes de encontrar un punto en la cadena
aux = ("%c", aux);
// esto me da error, y si uso "atoi" tambien y sino me carga el ascii
trio[i] = aux;
}else{
//se encontro un punto, trio debe de contener "192"

//se encontro un punto debo inicializar trio[] a cero, para
// seguir evaluando el segundo grupo de nros.
}
i++;
}

En resumen, necesito cargar una variable int ubicada entre los caracteres "." de la cadena, para luego verificar que la misma sea menor a 255.

Alguna idea para solucionar este tema? Desde ya muchas gracias por su interes,

Mis saludos;

luchot-
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Validar Direccion IP en C

Publicado por Ismael (230 intervenciones) el 14/06/2005 23:39:34
Mira en:

http://msdn.microsoft.com/msdnmag/issues/02/06/c/

Te describe:

// from winsock.h
struct hostent {
char* h_name; /* official name of host */
char* h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char* h_addr_list; /* list of addresses */
};


¿No has pensado en emplear un dato struct de valores int para tu problema? ¿E incluso un dato tipo campo de bits (bits field)?

Un saludo

Ismael
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Validar Direccion IP en C

Publicado por Ismael (230 intervenciones) el 14/06/2005 23:57:26
Me referia a algo similar a esto (esta en C):

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct dato
{
short uno;
short dos;;
short tres;
short cuatro;
}dir;

int main()
{
do
{
puts("\nIntro los cuatro bloque de la IP separados por punto (.)");
scanf("%u.%u.%u.%u", &dir.uno, &dir.dos, &dir.tres, &dir.cuatro);
}while(dir.uno<0||dir.dos<0||dir.tres<0||dir.cuatro<0||dir.uno>255|| \
dir.dos>255||dir.tres>255||dir.cuatro>255);

system("PAUSE");
//getch();

printf("\nLa IP ES: ");
printf("%u.%u.%u.%u\n\n\n", dir.uno, dir.dos, dir.tres, dir.cuatro);
system("PAUSE");
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Validar Direccion IP en C

Publicado por Luchot (7 intervenciones) el 15/06/2005 16:08:15
hola Ismael, muchas gracias por tus respuestas!

En realidad el articulo que esta en la URL que me pasas es para Windows y yo trabajo sobre linux, de todas maneras he encontrado una forma de hacerlo, utilizando subcadenas (parecido a lo que tu comentas pero sin estructuras), recorro la cadena principal, cargo las subcadenas entre los puntos, y luego comparo el valor de cada subcadena obteniendo el valor enterio (atoi(string)) para validar o invalidar:

El codigo es el siguiente:

char trio[3];
int subTotal;
int j=0,k=0;
while(j<strlen(nuevaIP)){
if(nuevaIP[j] != 46){
trio[k]=nuevaIP[j];
k++;
}else{
subTotal = atoi(trio);
if (subTotal > 255) {
printf ("\n IP fuera de rango: %i", subTotal) ;
valido=0;
for(k=0;k<3;k++) //estas 3 lineas no se si van o no
trio[k] = 0;
k=0;
break;
}
for(k=0;k<3;k++)
trio[k] = 0;
k=0;
}
j++;
}

Nuevamente muchas gracias por tus respuestas!

Mis saludos;

Luchot
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar