boost::asio::ip::<tcp/udp>::resolver 需要慎用它进行异步解析DNS地址列表。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值