Discussion:
deteccion de ip privada
(demasiado antiguo para responder)
genesis
2005-07-16 02:41:26 UTC
Permalink
hola..
tengo el siguiente codig

char nombre[120]
struct hostent *hp

gethostname(nombre, sizeof(nombre))
printf ("Nombre: %s",nombre)

hp=gethostbyname(nombre)

while (hp->h_addr_list[0]
printf("IP es %s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++))
printf("\n")

el problema es que me devuelve la dirección de loopback (127.0.0.1) , y quiero que m
entrege la direccion de la eth0 ( en mi caso 192.168.0.2)...
alguna idea ?

muchas gracias

--
genesis

-----------------------------------------------------------------------
Ver este tema: http://www.softwaremix.net/viewtopic-413038.htm

Enviado desde http://www.softwaremix.net
genesis
2005-07-16 03:51:38 UTC
Permalink
jeje ya me funciono !

en el main

int rec
struct ifreq if_data
u_int32_t myIP, myNETMASK, miip

if ((rec = socket (AF_INET, SOCK_STREAM, 0)) < 0

perror("socket")
exit (0)


strcpy (if_data.ifr_name, "eth0")
if (ioctl (rec, SIOCGIFADDR, &if_data) < 0
error ("error al obtener ip desde la interface")

memcpy ((void *) &miip, (void *) &if_data.ifr_addr.sa_data + 2, 4)
myIP = ntohl (miip)
printf ("IP local: %s\n", inetaddr(miip))

if (ioctl (rec, SIOCGIFNETMASK, &if_data) < 0
error ("error al obtener mascara")

memcpy ((void *) &miip, (void *) &if_data.ifr_netmask.sa_data + 2, 4)
myNETMASK = ntohl (miip)
printf ("mascara: %s\n", inetaddr(miip))

y adema

char * inetaddr ( u_int32_t ip

struct in_addr in
in.s_addr = ip
return inet_ntoa(in)


espero que a alguien mas le sirv

--
genesis

-----------------------------------------------------------------------
Ver este tema: http://www.softwaremix.net/viewtopic-413038.htm

Enviado desde http://www.softwaremix.net
McLeod / IdeaFix
2005-08-13 02:06:54 UTC
Permalink
jeje ya me funciono !!
Ah! Vale. No vi esa respuesta tuya :D
Pues sí, has usado la opción más elegante :D Enhorabuena!

McLeod / IdeaFix
2005-08-13 02:04:56 UTC
Permalink
el problema es que me devuelve la dirección de loopback (127.0.0.1) , y quiero que me
entrege la direccion de la eth0 ( en mi caso 192.168.0.2)....
alguna idea ??
Dos soluciones rápidas así que se me ocurran:
1. Con un pipe, lee la salida del comando "ifconfig eth0" y con
funciones de cadena, extraes la IP.
2. Abre un socket, conéctalo a una IP remota, por ejemplo, a un servidor
web bien conocido y que esté disponible, y después usa getsocketname() y
getpeername() para obtener las IP's local y remota (la local es la que
quieres).

La forma "elegante" de hacer lo que quieres es "preguntar" directamente
al núcleo usando una IOCTL al driver de red. Para esto no tengo
información, aunque estoy seguro que en el código fuente de alguna
herramienta de red, como nmap, sniffer, y similares, verás cómo lo han
hecho.

Saludos!
Loading...