use std::sync::mpsc; use std::net::UdpSocket; use std::thread::{self, JoinHandle}; mod proto; use proto::DNSHeader; fn listen() -> (JoinHandle<()>, mpsc::Sender>, mpsc::Receiver>) { let (tx, rx) = mpsc::channel(); let tx_clone = tx.clone(); ( thread::spawn(move || { let socket = UdpSocket::bind("127.0.0.1:13337").unwrap(); let mut buf = [0; 512]; loop { let (len, _src) = socket.recv_from(&mut buf).unwrap(); let buf = &mut buf[..len]; tx.send(Vec::from(buf)).unwrap(); } }), tx_clone, rx, ) } fn main() { let (thread_udp, _thread_udp_tx, thread_udp_rx) = listen(); for msg in thread_udp_rx.iter() { let hdr_struct = DNSHeader::from_udp_datagram(&msg).unwrap(); dbg!(hdr_struct); } let _ = thread_udp.join(); }