@@ -9,7 +9,7 @@ use crate::message::DnsMessage;
99use crate :: message:: rcode:: Rcode ;
1010
1111/// Structure to represent a Name Server
12- #[ derive ( Debug ) ]
12+ #[ derive ( Debug , Clone ) ]
1313pub 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