Запрос поиска SRV не возвращает IP-адрес

Пишу клиент XMPP. В RFC говорится, что мне нужно подключиться к серверу (например, этому ) с помощью запроса SRV.

Когда я использую для ящик этого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());
            }
        },
        _ => println!("SRV query failed."),
    }
}

Я думаю, что что-то неправильно понимаю, но не знаю что.

3 ответа

вместо

      for ip in response.ip_iter() {
    println!("{}", ip.to_string());
}

не могли бы вы попробовать это и поделиться мнениями?

      for ip in response.iter() {
    println!("{:?}", ip);
}
  • Это нормально, если поиск SRV не возвращает IP-адрес . в моем случае запрос возвращает только несколько кортежей, состоящих из имени домена и номера порта. После их получения я должен разрешить каждому из них, чтобы получить его IP-адрес с номером порта.

  • В trust_dns_protocrate является обязательным для работы с поиском 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. Его решение было далеко не идеальным, но оно помогло мне найти свое собственное.

Хорошо, правильно. У вас 3 записи SRV

Записи SRV связаны с целевым портом и доменом.

response.iter () возвращает trust_dns_proto :: rr :: rdata :: srv.

Извлечь порт с помощью ip.port()

и цель с

      let mut bytes = Vec::new();
let mut encoder: BinEncoder = BinEncoder::new(&mut bytes);
let is_canonical_names = encoder.is_canonical_names();

ip.target().emit_with_lowercase(encoder, is_canonical_names)?

Затем вам нужно разрешить цель, чтобы получить ip. Resolver::...

Другие вопросы по тегам