008 Rust 網路程式設計,使用 trust-dns-resolver 和 trust-dns

linghuyichong發表於2020-05-03

Trust-DNS是一個實現DNS協議和客戶端功能的庫。該庫包含DNS記錄序列化和通訊的基本實現,透過它能夠執行查詢、更新和通知等操作。Trust-DNS Resolver是對應的DNS解析庫,包括對應的IPv4和IPv6的一些實現。

本例子中,我們來實現一個查詢dns記錄的功能。

依賴

[dependencies]
trust-dns-resolver = "0.11.0"
trust-dns = "0.16.0"

原始碼

use std::env;
use trust_dns_resolver::Resolver;
use trust_dns_resolver::config::*;
use trust_dns::rr::record_type::RecordType;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() != 2 {
        eprintln!("Please provide a name to query");
        std::process::exit(1);
    }
    let query = format!("{}.", args[1]);

    // 建立預設解析器
    println!("Using the synchronous resolver");
    let resolver = Resolver::new(ResolverConfig::default(), ResolverOpts::default()).unwrap();
    let response = resolver.lookup_ip(query.as_str());
    for ans in response.iter() {
        println!("{:?}", ans);
    }

    // 根據系統配置檔案建立解析器,linux下為從/etc/resolv.conf建立
    println!("Using the system resolver");
    let system_resolver = Resolver::from_system_conf().unwrap();
    let system_response = system_resolver.lookup_ip(query.as_str());
    for ans in system_response.iter() {
        println!("{:?}", ans);
    }

    println!("NS records using the synchronous resolver");
    let ns = resolver.lookup(query.as_str(), RecordType::NS);
    for ans in ns.iter() {
        println!("{:?}", ans);
    }
}

執行

例如查詢baidu.com的資訊

cargo run baidu.com//注意,不要用www.baidu.com,否則會查詢不到
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章