Skip to content

Commit 6c1f96e

Browse files
committed
using lambdas, refactor that later
1 parent e875e31 commit 6c1f96e

File tree

1 file changed

+33
-11
lines changed

1 file changed

+33
-11
lines changed

src/nameserver.rs

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::message::DnsMessage;
99
use crate::message::rcode::Rcode;
1010

1111
/// Structure to represent a Name Server
12-
#[derive (Debug)]
12+
#[derive (Debug, Clone)]
1313
pub struct NameServer {
1414
zone: Vec<ResourceRecord>, // Each zone is associated with a domain.
1515
shared_sock: Arc<Mutex<UdpSocket>>,
@@ -24,23 +24,45 @@ impl NameServer {
2424
}
2525

2626
pub async fn run(&mut self, addr: &str) -> io::Result<()> {
27-
let mut buf = vec![];
27+
let mut buf = vec![0u8; 1024]; // Specify a buffer size for receiving data.
2828
self.init(addr).await?;
29+
30+
let shared_sock = self.shared_sock.clone();
31+
let zone = self.zone.clone(); // Clone the zone for use in the spawned tasks.
32+
2933
loop {
30-
let (len, src) = self.shared_sock.lock().await.recv_from(&mut buf).await?;
34+
let (len, src) = shared_sock.lock().await.recv_from(&mut buf).await?;
3135
println!("Received {} bytes from {:?}", len, addr);
32-
33-
// Spawn a new task to process the request
36+
3437
let data = buf[..len].to_vec();
35-
let socket_clone = self.shared_sock.clone();
38+
let zone_clone = zone.clone();
39+
let socket_clone = shared_sock.clone();
40+
// Handle the request concurrently
41+
3642
tokio::spawn(async move {
37-
// Handle the request concurrently!!! Important
38-
self.handle_request(socket_clone, data, src).await;
43+
let message = DnsMessage::from_bytes(&data).expect("Error parsing the message");
44+
45+
// Search for resource records in the cloned zone
46+
let rrs_to_add = NameServer::search_query(&zone_clone, &message);
47+
48+
if !rrs_to_add.is_empty() {
49+
let mut message = message;
50+
NameServer::add_rrs(&mut message, &rrs_to_add);
51+
52+
let response = message.to_bytes();
53+
let mut sock = socket_clone.lock().await;
54+
55+
if let Err(e) = sock.send_to(&response, src).await {
56+
eprintln!("Failed to send response to {}: {}", src, e);
57+
} else {
58+
println!("Sent response to {:?}", src);
59+
}
60+
}
3961
});
4062
}
4163
}
4264

43-
async fn handle_request(&self, socket: Arc<Mutex<UdpSocket>>,
65+
/*async fn handle_request(&self, socket: Arc<Mutex<UdpSocket>>,
4466
data: Vec<u8>,
4567
addr: std::net::SocketAddr) {
4668
let mut message = DnsMessage::from_bytes(&data).expect("Error al parsear el mensaje");
@@ -58,7 +80,7 @@ impl NameServer {
5880
} else {
5981
println!("Sent response to {:?}", addr);
6082
}
61-
}
83+
}*/
6284

6385
fn add_rrs(msg :&mut DnsMessage, rrs: &Vec<ResourceRecord>) {
6486
msg.set_answer(rrs.clone());
@@ -79,7 +101,7 @@ impl NameServer {
79101
qclass == rr.get_rclass()
80102
&& qtype == rr.get_rtype()
81103
&& qname == rr.get_name())
82-
.collect()
104+
.cloned().collect()
83105
}
84106
}
85107

0 commit comments

Comments
 (0)