SRV lookup请求未返回IP地址,XMPP客户端trust_dns_resolver查询异常
问题解答
现象说明
你遇到的返回空结果属于正常行为,不是代码运行出错或者DNS查询失败,问题出在对trust_dns_resolver的API逻辑理解偏差。
根本原因
SrvLookup::ip_iter() 方法只会读取SRV查询响应的**附加段(Additional Section)**中附带的A/AAAA类型IP记录。绝大多数公共DNS服务器不会主动在SRV响应的附加段填充对应目标域名的IP解析结果,因此该方法返回空是普遍情况。
你在命令行执行dig命令能直接看到对应IP,是因为dig工具默认会自动对SRV记录返回的目标域名执行后续A/AAAA查询,并非单次SRV查询就拿到了IP结果。
修正方案
正确的查询逻辑分为两步:
- 执行SRV查询获取所有目标域名、端口、优先级、权重信息
- 对每个SRV返回的目标域名单独发起A/AAAA查询获取IP
修正后代码示例
use trust_dns_resolver::Resolver; use trust_dns_resolver::Name; use std::str::FromStr; fn main() { let resolver = Resolver::from_system_conf().unwrap(); match resolver.srv_lookup(Name::from_str("_xmpp-client._tcp.xmpp.jp").unwrap()) { Ok(srv_response) => { // 遍历所有SRV记录 for srv in srv_response.iter() { let target = srv.target(); let port = srv.port(); println!("SRV目标:{}:{},优先级:{},权重:{}", target, port, srv.priority(), srv.weight()); // 对目标域名单独查询IP match resolver.lookup_ip(target) { Ok(ip_response) => { for ip in ip_response.iter() { println!(" 对应IP:{}", ip); } }, Err(e) => println!(" 查询{}的IP失败:{}", target, e), } } }, Err(e) => println!("SRV查询失败:{}", e), } }
内容的提问来源于stack exchange,提问作者Apitronix
相关产品推荐
相关产品推荐

