Windows'ta C++ 'dan DNS sorguları yapmak için getaddrinfo kullanıyorum. Windows API DnsQuery'yi kullandım ve bu iyi çalıştı, ancak yazılımıma IPv6 desteği eklerken getaddrinfo'ya geçtim. O zamandan beri, ben gördüm:Yavaş yanıt getaddrinfo'dan
Benim sorunum getaddrinfo tamamlamak için çok uzun zaman alıyor olmasıdır. Getaddrinfo'dan gelen tipik yanıt yalnızca birkaç milisaniye sürer, ancak yaklaşık 10000'den 1 kez daha uzun zaman alır, bazı durumlarda yaklaşık 15 saniye sürer, ancak birkaç dakika sürdüğü birkaç durum vardır.
sunucuda Wireshark'ı çalıştırın ve uygulamalarım ayıklama günlükleri analiz ve aşağıdakilere bakın ettik:
- ben işlev getaddrinfo diyoruz.
- 15 saniye sonra, makinem DNS sunucusunu sorgular.
- Bazı milisaniye sonra, DNS sunucusundaki yanıtı alıyorum.
Burada garip olan şey, gerçek DNS sorgusunun yalnızca saniyenin onda birini almasıdır, ancak getaddrinfo'nun gerçekten çalıştığı süre çok daha uzun.
Sorun, birçok kullanıcı tarafından bildirilmiştir, bu yüzden makinem için belirli bir şey değil.
Getaddrinfo, DNS sunucusuyla iletişim kurmanın ötesinde ne yapar?
Düzenleme:
- sorun sayıda adres oluştu. Bu adresleri kullanarak sorunu yeniden oluşturmaya çalışırsam sorun oluşmaz.
- Aptalca bir şey yaptım. Her DNS sorgusunda, etc/services ayrıştırılır. Ancak, bu birkaç dakika gecikmeyi açıklamıyor. Benim yazılım tarafından yapılan DNS sorgularının (teşekkürler D.Shawley)
Düzenleme 2
- Bir tür anti-spam DNSBL sorguları olduğunu. Bir kullanıcıdan gelen günlük, her zaman tam olarak 2039 saniyeyi aldığını görünce, ip.address1.example.com aramasının her zaman tam olarak 1324 saniye sürdüğünü gösterdi. Bundan sonraki gün, bu adreslerin aramaları gayet iyi. İlk başta, DNS BL yazarlarının kendi taraflarında bir çeşit zaman aşımı olduğunu düşündüm. Ama bu temel problem olsaydı, getaddrinfo daha önce zaman aşımına uğramış olmalıydı?
Yalnızca belirli, belirli adresler için sorgular yavaş mı? – SimonJ
FileMon gibi bir şey çalıştırmayı deneyin ve "c: \ windows \ system32 \ drivers \ etc \ services" ve "c: \ windows \ system32 \ drivers \ etc \ hosts" öğelerini okuma ve ayrıştırma gibi aptalca bir şey yapmadığından emin olun. getaddrinfo() 'aradığınız süre. –
Hemen hemen her çağrıda ana bilgisayar dosyasını ayrıştırırdı, ancak bu bir milisaniye veya ikiden fazla sürmemelidir. –