udpflow/
listener.rs

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
9/// Udp packet listener.
10pub struct UdpListener {
11    socket: Arc<UdpSocket>,
12}
13
14impl UdpListener {
15    /// Create from a **bound** udp socket.
16    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    /// Accept a new stream.
23    ///
24    /// On success, it returns peer stream socket, peer address and
25    /// the number of bytes read.
26    /// [`UdpStreamLocal`](super::UdpStreamLocal).  
27    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}