SRV 查找请求不返回 IP 地址

Posted

技术标签:

【中文标题】SRV 查找请求不返回 IP 地址【英文标题】:SRV lookup request doesn't return an IP address 【发布时间】:2021-07-27 20:32:01 【问题描述】:

我正在编写一个 XMPP 客户端。 RFC 表示我需要使用 SRV 查询连接到服务器(如 this one)。

当我使用 trust_dns_resolver 板条箱这样做时,查询似乎是空的。这是正常现象吗?

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(response) => 
            for ip in response.ip_iter() 
                println!("", ip.to_string());
            
        ,
        Err(e) => println!("", e),
    

dig SRV _xmpp-client._tcp.xmpp.jp 命令行返回以下内容:

; <<>> DiG 9.16.18 <<>> SRV _xmpp-client._tcp.xmpp.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16710
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 2605a5d828b394e22ffbec3e61010461a668fc990570d859 (good)
;; QUESTION SECTION:
;_xmpp-client._tcp.xmpp.jp. IN  SRV

;; ANSWER SECTION:
_xmpp-client._tcp.xmpp.jp. 23   IN  SRV 20 10 5222 sapporo.xmpp.jp.
_xmpp-client._tcp.xmpp.jp. 23   IN  SRV 30 10 5222 gw.lb.xmpp.jp.
_xmpp-client._tcp.xmpp.jp. 23   IN  SRV 10 10 5222 tokyo.xmpp.jp.

;; Query time: 13 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: mer. juil. 28 09:16:49 CEST 2021
;; MSG SIZE  rcvd: 183

我应该有三个 IP 地址吧?

我想我误会了什么,但我不知道是什么。

【问题讨论】:

您确认可以在应用外查询SRV记录吗?例如。 dig -t srv +short _xmpp._tcp.example.com. dig 似乎给了我三个结果,而应用程序什么也没给我。 【参考方案1】:

如果 SRV 查找没有返回 IP 地址也没关系。在我的例子中,查询只返回几个由域名和端口号组成的元组。得到它们后,我必须解析每一个以获取其 IP 地址及其端口号。

trust_dns_proto crate 是处理 SRV 查找所必需的。所以我把它添加到Cargo.toml 文件中,编译器停止哭泣......

然后我可以编写以下代码来提取端口号和域名:

use trust_dns_resolver::Resolver;
use trust_dns_resolver::Name;
use std::str::FromStr;
[...]
    let resolver = Resolver::from_system_conf().unwrap();
    match resolver.srv_lookup(Name::from_str("_xmpp-client._tcp.xmpp.jp.").unwrap())  
        Ok(response) => 
            for srv in response.iter() 
                println!("Port number:\t", srv.port());
                println!("Domain name:\t\n", srv.target().to_utf8());
                // have to resolve the domain name here
            
            println!("", response.query().name());
        ,
        Err(e) => println!("", e),
    

感谢 Zeppi。他的解决方案远非完美,但它让我找到了自己的解决方案。

【讨论】:

以上是关于SRV 查找请求不返回 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

ipconfig出现很多IP地址,怎么清楚缓存地址

从输入url到页面展示到底发生了什么

java 怎么写一个接口 让他返回服务器的动态IP地址和端口?

Linux系统——http协议原理

使用Python的stdlib查找本地IP地址

在输入一个url到返回页面,中间发生了什么?