boost::asio::ip::<tcp/udp>::resolver 的确可以异步解析 dns 地址列表,但在并发查询场景下,潜在会出现假死问题。
即:async_resolve 永远也不会触发 completed callback,或者较长的时间后(这通常超过四五秒),这或许会导致 C++ 协程或异步事务上下文,长时间被阻断或保持资源持有。
所以:如非必要时,不得使用 boost::asio::ip::<tcp/udp>::resolver,当然,一定采用它,则需要好好改改底层的实现,但这并无必要。
boost::asio::ip::<tcp/udp>::resolver 同步实现是没有问题的,它本来也是调用的C函数库的这些函数实现的。
比如:gethostbyname、getaddrinfo、gethostbyaddr 这些函数,底层同步,Windows 上性能会好一些。
目前主流 asio 库底层实现之中是通过调用:getaddrinfo 函数解析后并触发 callback。
一个好的建议是,如果确实需要异步查询,可以考虑在 git 上搜索 C++ 支持异步的 dnslib,比如:
1、YukiWorkshop/cpp-dns: C++ async DNS resolver using UDNS & Boost
2、auxten/gko_pool: async server&client framework learned from memcached, with async dns resolve
3、stealth/fernmelder: async mass DNS resolver
当然, 你仍然可以自行构建一个小型DNS解析客户端,这并不复杂,可以参考构建:
openppp2/ppp/net/asio/vdns.cpp at main · liulilittle/openppp2
liulilittle/dnslib-cpp: C++ library for encoding and decoding of DNS protocol packets