Sto utilizzando getaddrinfo per eseguire query DNS da C++ su Windows. Ho usato DnsQuery dell'API di Windows e questo ha funzionato bene, ma quando ho aggiunto il supporto IPv6 al mio software sono passato a getaddrinfo. Da allora, ho visto quanto segue:Risposta lenta da getaddrinfo
Il mio problema è che alcune volte getaddrinfo impiega molto tempo per completare. La tipica risposta di getaddrinfo richiede solo pochi millisecondi, ma circa 1 volta su 10000, richiede più tempo, in alcuni casi circa 15 secondi, ma ci sono stati diversi casi in cui sono necessari diversi minuti.
Ho eseguito Wireshark sul server e analizzato mie Applicazioni registri di debug e visualizzare le seguenti:
- chiamo la funzione getaddrinfo.
- 15 secondi dopo, il mio computer interroga il server DNS.
- Alcuni millisecondi più tardi, ottengo la risposta dal server DNS.
La cosa strana qui è che la query DNS effettiva impiega solo un decimo di secondo, ma il tempo in cui getaddrinfo viene effettivamente eseguito è molto più lungo.
Il problema è stato segnalato da molti utenti, quindi non è qualcosa di specifico per la mia macchina.
Quindi cosa fa getaddrinfo più che contattare il server DNS?
Edit:
- Il problema si è verificato con diversi indirizzi. Se provo a riprodurre il problema utilizzando questi indirizzi, il problema non si verifica.
- Ho fatto qualcosa di stupido. Su ogni query DNS, vengono analizzati i servizi/etc. Tuttavia, ciò non spiega un ritardo su diversi minuti. (Grazie D.Shawley)
Edit 2
- Un tipo di query DNS fatte da mio software è query DNSBL anti-spam. Il log di un utente mi ha mostrato che la ricerca di ip.address1.example.com sembrava richiedere sempre esattamente 2039 secondi, mentre la ricerca di another.ip.address.example.com richiedeva sempre esattamente 1324 secondi. Il giorno dopo, le ricerche per quegli indirizzi andavano bene. All'inizio pensavo che gli autori dei DNS BL avessero messo una specie di timeout dalla loro parte. Ma se questo fosse il problema principale, getaddrinfo dovrebbe essere scaduto prima?
Sono solo le query per determinati indirizzi specifici che sono lenti? – SimonJ
Prova a eseguire qualcosa come FileMon e assicurati che non stia facendo qualcosa di stupido come leggere e analizzare 'c: \ windows \ system32 \ drivers \ etc \ services' e' c: \ windows \ system32 \ drivers \ etc \ hosts' ogni tempo che chiami 'getaddrinfo()'. –
Quasi certamente analizzerebbe il file hosts almeno su ogni chiamata, ma ciò non dovrebbe richiedere più di un millisecondo o due. –