You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结果。

修正方案

正确的查询逻辑分为两步:

  1. 执行SRV查询获取所有目标域名、端口、优先级、权重信息
  2. 对每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:30:04