2008-09-24 15 views
6

Si nuestro servidor (que se ejecuta en un dispositivo) se inicia antes de que se haya adquirido una concesión de DHCP, entonces nunca se puede conectar utilizando un nombre de host.Usando glibc, ¿por qué mi gethostbyname falla después de que I/DHCP ha cambiado el servidor DNS?

Si eso sucede, puede encontrar hosts por dirección IP pero no por DNS.

Inicialmente pensé que la caché de DNS de Curl había fallado porque las conexiones de curvatura fallaron. Pero utilicé CURLOPT_DNS_CACHE_TIMEOUT para evitar que curl cachee la dirección pero las conexiones aún fallaron.

+0

¿Puedo desentrañar esta antigua pregunta preguntándome si hay alguna otra solución? El problema es que 'res_init()' es mucho menos portable que la API 'libcurl'. En algunas plataformas de soporte de Curl, no existe; en muchos otros no es seguro para subprocesos. – NickJH

Respuesta

9

Resulta que glibc gethostbyname_r no recargará automáticamente su configuración si esa configuración cambia. Tienes que llamar manualmente a res_init. Ver bug report a continuación.

Nota: Ni la página del manual para gethostbyname_r ni para rer_init mencionó esta limitación.

Mi solución es muy específica. Funciona para nuestro servidor de larga ejecución, pero no es mi solución ideal.

Tengo una función que verifica el mtime del /etc/resolv.conf contra el último mtime conocido (0 para DNE). Si los dos mtime difieren, entonces llamo a res_init. Esta función se invoca al inicio del programa y luego periódicamente para volver a cargar la configuración.


El glibc bug report

cachés libc resolv.conf para siempre

...

Eso es lo que res_init() es para, llamarlo.

Cuestiones relacionadas