@@ -9,7 +9,7 @@ use crate::message::DnsMessage;
9
9
use crate :: message:: rcode:: Rcode ;
10
10
11
11
/// Structure to represent a Name Server
12
- #[ derive ( Debug ) ]
12
+ #[ derive ( Debug , Clone ) ]
13
13
pub struct NameServer {
14
14
zone : Vec < ResourceRecord > , // Each zone is associated with a domain.
15
15
shared_sock : Arc < Mutex < UdpSocket > > ,
@@ -24,23 +24,45 @@ impl NameServer {
24
24
}
25
25
26
26
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.
28
28
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
+
29
33
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 ?;
31
35
println ! ( "Received {} bytes from {:?}" , len, addr) ;
32
-
33
- // Spawn a new task to process the request
36
+
34
37
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
+
36
42
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
+ }
39
61
} ) ;
40
62
}
41
63
}
42
64
43
- async fn handle_request ( & self , socket : Arc < Mutex < UdpSocket > > ,
65
+ /* async fn handle_request(&self, socket: Arc<Mutex<UdpSocket>>,
44
66
data: Vec<u8>,
45
67
addr: std::net::SocketAddr) {
46
68
let mut message = DnsMessage::from_bytes(&data).expect("Error al parsear el mensaje");
@@ -58,7 +80,7 @@ impl NameServer {
58
80
} else {
59
81
println!("Sent response to {:?}", addr);
60
82
}
61
- }
83
+ }*/
62
84
63
85
fn add_rrs ( msg : & mut DnsMessage , rrs : & Vec < ResourceRecord > ) {
64
86
msg. set_answer ( rrs. clone ( ) ) ;
@@ -79,7 +101,7 @@ impl NameServer {
79
101
qclass == rr. get_rclass ( )
80
102
&& qtype == rr. get_rtype ( )
81
103
&& qname == rr. get_name ( ) )
82
- . collect ( )
104
+ . cloned ( ) . collect ( )
83
105
}
84
106
}
85
107
0 commit comments