2 个版本
0.1.1 | 2018 年 12 月 12 日 |
---|---|
0.1.0 | 2018 年 11 月 25 日 |
#4 in #knot
2MB
43K 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