Estoy usando getaddrinfo para hacer consultas DNS desde C++ en Windows. Solía usar Windows API DnsQuery y funcionó bien, pero cuando agregué compatibilidad con IPv6 a mi software, cambié a getaddrinfo. Desde entonces, he visto lo siguiente:Respuesta lenta de getaddrinfo
Mi problema es que algunas veces getaddrinfo toma mucho tiempo en completarse. La respuesta típica de getaddrinfo toma solo unos pocos milisegundos, pero aproximadamente 1 vez de cada 10000, lleva más tiempo, en algunos casos alrededor de 15 segundos, pero ha habido varios casos en los que tarda varios minutos.
me he encontrado Wireshark en el servidor de aplicaciones y analicé mis registros de depuración y ver lo siguiente:
- que llame a la función getaddrinfo.
- 15 segundos después, mi máquina consulta el servidor DNS.
- Algunos milisegundos más tarde, recibo la respuesta del servidor DNS.
Lo extraño aquí es que la consulta DNS real solo toma una décima de segundo, pero el tiempo que getaddrinfo realmente se ejecuta es mucho más largo.
El problema ha sido reportado por muchos usuarios, por lo que no es algo específico de mi máquina.
Entonces, ¿qué hace getaddrinfo más que contactar al servidor DNS?
Editar:
- El problema ha ocurrido con varias direcciones. Si trato de reproducir el problema usando estas direcciones, el problema no ocurre.
- He hecho algo estúpido. En cada consulta DNS, se analiza el etc/services. Sin embargo, eso no explica una demora en varios minutos. (Gracias D.Shawley)
Editar 2
- Un tipo de consultas DNS realizadas por el software es DNSBL consultas anti-spam. El registro de un usuario me mostró que la búsqueda de ip.address1.example.com siempre parecía tomar exactamente 2039 segundos, mientras que la búsqueda de another.ip.address.example.com siempre tomaba exactamente 1324 segundos. El día después de eso, las búsquedas de esas direcciones estaban bien. Al principio pensé que los autores de DNS BL habían puesto un poco de tiempo de espera de su parte. Pero si este era el problema central, ¿debería haber agotado el tiempo de getaddrinfo?
¿Son solo las consultas para ciertas direcciones específicas que son lentas? – SimonJ
Intenta ejecutar algo como FileMon y asegúrate de que no esté haciendo algo estúpido como leer y analizar 'c: \ windows \ system32 \ drivers \ etc \ services' y' c: \ windows \ system32 \ drivers \ etc \ hosts' cada hora a la que llama 'getaddrinfo()'. –
Es casi seguro que analizará el archivo de hosts al menos en cada llamada, pero eso no debería tomar más de un milisegundo o dos. –