#resolver #bindings #request #knot #context #cache #libkres

sys kres

绑定到 Knot 解析器库(也称为 libkres)

2 个版本

0.1.1 2018 年 12 月 12 日
0.1.0 2018 年 11 月 25 日

#4 in #knot

MIT/Apache

2MB
43K SLoC

C 35K SLoC // 0.2% comments Lua 6K SLoC // 0.1% comments Shell 643 SLoC // 0.2% comments JavaScript 599 SLoC // 0.1% comments Rust 343 SLoC // 0.0% comments Go 211 SLoC // 0.0% comments RPM Specfile 192 SLoC // 0.1% comments Jinja2 172 SLoC Bitbake 133 SLoC // 0.3% comments Pan 87 SLoC Python 43 SLoC // 0.4% comments Forge Config 28 SLoC

包含 (WOFF 字体, 19KB) glyphicons-halflings-regular.woff2

rust-kres

本软件包为 Knot 解析器库(libkres)提供一个安全的接口。 libkres 是一个完整的 DNS 递归解析器实现,包括缓存和 DNSSEC 验证。它不需要特定的 I/O 模型,而是提供一个通用的接口来推送/拉取 DNS 消息,直到请求得到满足。

示例

use std::net::{SocketAddr, UdpSocket};
use kres::{Context, Request, State};

// DNS message wire format
let question = [2, 104, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1];
let from_addr = "127.0.0.1:1234".parse::<SocketAddr>().unwrap();

let context = Context::new();
let req = Request::new(context.clone());
let mut state = req.consume(&question, from_addr);

// Process the subrequests
while state == State::PRODUCE {
    state = match req.produce() {
        Some((msg, addr_set)) => {

            // This can be any I/O model the application uses
            let mut socket = UdpSocket::bind("0.0.0.0:0").unwrap();
            socket.send_to(&msg, &addr_set[0]).unwrap();
            let mut buf = [0; 512];
            let (amt, src) = socket.recv_from(&mut buf).unwrap();

            // Pass the response back to the request
            req.consume(&buf[..amt], src)
        },
        None => {
            break;
        }
    }
}

// Convert request into final answer
let answer = req.finish(state).unwrap();

依赖项

~1.6–4MB
~75K SLoC