resolve/
resolve.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use std::net::UdpSocket;
use rand::Rng;
use rusdig::{AuthoritativeNameserverAnswer, Query, RecordType};

fn main() {
	let query = Query::for_name("にゃ.shop", RecordType::A);
	let bytes = query.as_bytes().unwrap();

	let socket = UdpSocket::bind(format!("0.0.0.0:{}", rand::thread_rng().gen_range(1001..64000))).unwrap();
	socket.connect("1.1.1.1:53").unwrap();
	socket.send(&bytes).unwrap();

	println!("Sent request");

	let mut buf = vec![0u8; 1024];
	let recvd = socket.recv(buf.as_mut_slice()).unwrap();
	buf.truncate(recvd);

	println!("Received response of length ({})", recvd);

	let query = Query::from_bytes(&buf).unwrap();

	for (i, question) in query.resource_queries.iter().enumerate() {
		println!("Question #{} of Type '{}':", i, question.ty_str());
		println!("  - For Name: {}", question.name());
	}

	for (i, answer) in query.resource_answers.iter().enumerate() {
		println!("Answer #{}:", i);
		match answer.entry_type() {
			RecordType::A | RecordType::NS => {
				println!("  - IPv4: {}", answer.data_as_ipv4().unwrap());
			}
			RecordType::AAAA => {
				println!("  - IPv6: {}", answer.data_as_ipv6().unwrap());
			}
			_ => {
				println!("  - Data: {}", answer.data_as_text().unwrap());
			}
		}
	}

	for (i, authoritative) in query.resource_authorities.iter().enumerate() {
		println!("Authority #{}: ", i);
		println!("  - For Name: {}", authoritative.name());
		println!("  - Primary Name Server: {}", authoritative.primary_ns());
		println!("  - Responsible Authority Mailbox: {}", authoritative.responsible_mail());
	}
}