2017-06-30 61 views
1

我需要發送DNS請求來檢查域的A,AAAA,MX和SOA記錄。如何在Rust中檢索不同類型的DNS記錄?

有2個流行的DNS庫:trust-dnsdns-parser。他們都沒有一個例子。 trust-dns不支持我需要做的事情,而dns-parser的文檔沒有幫助。

+0

我認爲SO不是問這個問題的好地方。你應該在github中打開一個問題來要求解釋,也許在文檔中有更多的例子。 – Boiethios

+0

@Boiethios表面上的問題似乎在話題上:如何檢索DNS記錄。 OP顯示他們已經找到了一些庫,並且至少查找了一些示例,並在文檔中顯示他們已經嘗試了一些。 – Shepmaster

+0

@Shepmaster我說「不是更好的地方」:我認爲這個問題是關於主題的,但IMO OP有更多的機會在github項目中得到答案。 – Boiethios

回答

6

domain箱子似乎支持您的使用情況。它也建立在對期望的網絡請求很好的期貨之上。

extern crate domain; 
extern crate futures; 
extern crate tokio_core; 

use std::str::FromStr; 
use domain::bits::{DNameBuf, ParsedDName}; 
use domain::iana::{Class, Rtype}; 
use domain::rdata::{A, Aaaa, Mx, Soa}; 
use domain::resolv::Resolver; 
use futures::Future; 
use tokio_core::reactor::Core; 

fn main() { 
    let mut core = Core::new().unwrap(); 
    let resolv = Resolver::new(&core.handle()); 

    let name = DNameBuf::from_str("www.rust-lang.org.").unwrap(); 

    let v4 = resolv.clone().query((name.clone(), Rtype::A, Class::In)); 
    let v6 = resolv.clone().query((name.clone(), Rtype::Aaaa, Class::In)); 
    let mx = resolv.clone().query((name.clone(), Rtype::Mx, Class::In)); 
    let soa = resolv.query((name, Rtype::Soa, Class::In)); 

    let addrs = v4.join4(v6, mx, soa); 

    let (v4, v6, mx, soa) = core.run(addrs).unwrap(); 

    println!("-- A --"); 

    for record in v4.answer().unwrap().limit_to::<A>() { 
     println!("{}", record.unwrap()); 
    } 

    println!("-- AAAA --"); 

    for record in v6.answer().unwrap().limit_to::<Aaaa>() { 
     println!("{}", record.unwrap()); 
    } 

    println!("-- MX --"); 

    for record in mx.answer().unwrap().limit_to::<Mx<ParsedDName>>() { 
     println!("{}", record.unwrap()); 
    } 

    println!("-- SOA --"); 

    for record in soa.answer().unwrap().limit_to::<Soa<ParsedDName>>() { 
     println!("{}", record.unwrap()); 
    } 
} 

我從來沒有見過今天之前這個箱子,所以我不知道我正確或有效地使用它,但它似乎工作。