Я использую getaddrinfo, чтобы сделать запросы DNS от C++ в Windows. Я раньше использовал Windows API DnsQuery, и это хорошо работало, но при добавлении поддержки IPv6 моему программному обеспечению я переключился на getaddrinfo. С тех пор я видел следующее:
Моя проблема состоит в том, что несколько раз getaddrinfo занимают очень долгое время для завершения. Типичный ответ от getaddrinfo берет всего несколько миллисекунд, но примерно в 1 раз из 10 000, он занимает время, в некоторых случаях приблизительно 15 секунд, но было несколько случаев, когда требуется несколько минут.
Я выполнил Wireshark на сервере и проанализировал мои журналы отладки приложений и вижу следующее:
Странная вещь здесь состоит в том, что фактический запрос DNS только занимает одну десятую секунды, но время getaddrinfo на самом деле выполняется, намного длиннее.
О проблеме сообщили многие пользователи, таким образом, это не что-то характерное для моей машины.
Таким образом, что getaddrinfo делает больше, чем контакт сервер DNS?
Править:
Редактирование 2
В Windows есть локальный демон, который выполняет кэширование DNS. Ваш вызов getaddrinfo () направляется этому демону, который предположительно проверяет свой кеш перед отправкой запроса на ваш DNS-сервер.
См. статью 318803 базы знаний Windows для получения дополнительной информации об отключении кеша.
[Отредактировано]
Мне кажется, что ваш экземпляр Windows Server 2003 неправильно настроен для IPv6. По истечении времени ожидания поиска IPv6 он вернется к IPv4. Статьи базы знаний, которые могут помочь, включают:
К сожалению, у меня нет доступа ни к одному серверу Windows, поэтому я не могу проверить / воспроизвести его самостоятельно.