Re: [Grulic-dev] Obtener DNS y Gateway en Linux

Página superior
Adjuntos:
+ (text/plain)

Responder a este mensaje
Autor: Maxi Combina
Fecha:  
A: Lista de desarrollo de software libre
Asunto: Re: [Grulic-dev] Obtener DNS y Gateway en Linux
> 2008/8/18 Daniel F Moisset <arnetsucks@???>
>
> > --- El lun 18-ago-08, Maxi Combina <maxicombina@???> escribió:
> >
> > > Necesitaría poder averiguar, desde C y en Linux, la
> > > dirección IP del
> > > servidor de DNS y del gateway actuales.
> > > Para averiguar cosas similares (como la mac address) usé
> > > ioctl(), pero no
> > > encuentro forma de buscar estos 2 datos...
> >
> > Si haces un par de suposiciones (como que la resolución principal es por
> > DNS y no otro mecanismo, y que todo el mundo usa la libc), los DNSs los
> > obtenes leyendo /etc/resolv.conf, las lineas que empiezan con nameserver.
> >
> > La direccion del gateway la buscas en /proc/net/route. Si la segunda
> > columna es 00000000, y la cuarta es 0003, la 3ra debería ser un default


Dato: también (o "solamante"?) hay que buscar el flag apropiado en la
columna Flags :)

> > gateway (podes tener mas de uno). En formato hexadecimal, por ejemplo yo
> > tengo 8001A8C0 para 192.168.1.128 (0xc0.0xa8.0x01.0x80)
> >
> > Saludos,
> > D.


Gracias!
Me hacia dudar la forma de obtener los servers de DNS... pensé que
habria alguna funcion del SO (en Mac hay, por eso mi duda).

2008/8/18 Rafael Carrascosa <rafacarrascosa@???>
Upa! mmm... hablo solo para ser abofetado con el conocimiento de los que mas
saben: yo usaba "route" para averiguar el gateway... esta mal? que ventaja
tiene leerlo desde proc? (ademas de que esta en amistosisimo hexa).

*Supongo* que perdes un poco más de tiempo leyendo la salida de
"route", nada mas. Viste cómo está implementado route? Lee de
/proc/net/route.... Yo vi un codigo viejo, pero corri un strace con el
route de mi distro favorita y vi que tambien lee /proc/net/route.

Por otro lado, no es tan feo leer el número en hexa. Si lo querés en
x.x.x.x, usas inet_ntoa. Algo como:

unsigned long gateway = leer_el_gateway_en_hexa(); // eso va de tarea
struct in_addr mestre = {gateway};
printf("el gw es %s\n", inet_ntoa(mestre));

Si queres saber el gateway desde una consola, y no desde C, entonces
claro que es mejor route :)

saludos y gracias,
maxi