Usando glibc, perché il mio gethostbyname fallisce dopo che I / DHCP ha cambiato il server DNS?

StackOverflow https://stackoverflow.com/questions/125466

  •  02-07-2019
  •  | 
  •  

Domanda

Se il nostro server (in esecuzione su un dispositivo) si avvia prima dell'acquisizione di un lease DHCP, non può mai connettersi utilizzando un nome host.

Se ciò accade, può trovare host per indirizzo IP ma non per DNS.

Inizialmente pensavo che la cache DNS Curl fosse in errore poiché le connessioni curl fallivano. Ma ho usato CURLOPT_DNS_CACHE_TIMEOUT per impedire al ricciolo di memorizzare nella cache l'indirizzo ma le connessioni non sono ancora riuscite.

È stato utile?

Soluzione

Si scopre che glibc gethostbyname_r non ricaricherà automaticamente la sua configurazione se tale configurazione cambia. Devi chiamare manualmente res_init. Vedi segnalazione di bug di seguito.

Nota: né la pagina man di gethostbyname_r né rer_init hanno menzionato questa limitazione.

La mia soluzione è molto specifica. Funziona per il nostro server di lunga durata ma non è la mia soluzione ideale.

Ho una funzione che controlla il mtime di /etc/resolv.conf rispetto all'ultimo mtime noto (0 per DNE). Se i due mtime differire quindi chiamo res_init. Questa funzione viene chiamata all'avvio del programma e quindi periodicamente per ricaricare facoltativamente la configurazione.


Il glibc segnalazione di bug

  

libc memorizza nella cache resolv.conf per sempre

     

...

     

Ecco a cosa serve res_init (), chiamalo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top