#dns-resolver #dns-client #dns #resolver #client-side #async #dns-query

cdns-rs

客户端DNS解析器的原生Sync/Async Rust实现

7个版本

0.2.6 2024年3月24日
0.2.5 2024年3月24日
0.2.2 2022年1月10日
0.1.1 2021年11月7日

#6 in #resolver

Download history 3/week @ 2024-04-08 5/week @ 2024-06-03 2/week @ 2024-06-10 22/week @ 2024-07-01 60/week @ 2024-07-22

82 每月下载量
ipfw-rs 中使用

MPL-2.0 许可证

350KB
8K SLoC

CDns-rs

v 0.2不稳定版

一个客户端DNS查询库的实现,同时能够查找/etc/hosts中的主机名。
它还能够解析/etc/resolv.conf并使用该文件中的选项来自配置自己。因此,它类似于libc的gethostbyname(3)gethostbyaddr(3)。配置可以被覆盖。

此库支持异步和同步代码。目前异步部分不可用,因为

  • 它基于同步实现,因为异步代码基于同步代码,而同步代码目前不稳定
  • 它需要适当的从同步迁移,因为同步使用poll(2)来并行进行名称解析

支持

  • 通过TCP/UDP发送和接收响应
  • 通过尝试TCP响应消息截断事件
  • 解析/etc/hosts(所有选项)
  • 部分解析/etc/resolve.conf(所有选项)
  • 异步和同步代码(分别实现)目前异步不可用!
  • 并行和非并行nameserver查询

待办事项

  • 解析/etc/nsswitch.conf
  • DNSSEC
  • DNS-over-TLS
  • OPT_NO_CHECK_NAMES
  • resolv.conf(search、domain、sortlist)

使用方法

  • 见./examples/
  • 见shortcuts.rs

简单示例

use cdns_rs::sync::{QDns, QuerySetup, QType, request, caches::CACHE};

fn main()
{
    // a, aaaa
    let res_a = request::resolve_fqdn("protonmail.com", None).unwrap();

    println!("A/AAAA:");
    for a in res_a
    {
        println!("\t{}", a);
    }
}

自定义查询

use cdns_rs::sync::{QDns, QuerySetup, QType, request, caches::CACHE};

fn main()
{
    // soa
    let mut dns_req = 
        QDns::make_empty(resolvers, 1, QuerySetup::default());

    dns_req.add_request(QType::SOA, "protonmail.com");

    // sending request and receiving results
    let res = dns_req.query();


    println!("SOA:");
    if res.is_results() == true
    {
        let inner = res.into_inner().unwrap();

        for i in inner
        {
            for r in i.get_responses()
            {
                println!("\t{}", r);
            }
        }
    }
    else
    {
        println!("\tNo SOA found!")
    }
}

依赖项

~5–13MB
~152K SLoC