1use std::io::Result;
2use std::net::SocketAddr;
3use std::sync::Arc;
4
5use tokio::net::UdpSocket;
6
7use crate::{UdpStreamLocal, new_udp_socket};
8
9pub struct UdpListener {
11 socket: Arc<UdpSocket>,
12}
13
14impl UdpListener {
15 pub fn new(local_address: SocketAddr) -> std::io::Result<Self> {
17 Ok(Self {
18 socket: Arc::new(new_udp_socket(local_address)?),
19 })
20 }
21
22 pub async fn accept(&self, buf: &mut [u8]) -> Result<(usize, UdpStreamLocal, SocketAddr)> {
28 let (n, addr) = self.socket.recv_from(buf).await?;
29
30 debug_assert!(n != 0);
31
32 let stream = UdpStreamLocal::new(self.socket.local_addr().unwrap(), addr).await?;
33
34 Ok((n, stream, addr))
35 }
36}