toad/std/net/
mod.rs

1use std::io;
2use std::net::UdpSocket;
3
4use naan::prelude::{Monad, MonadOnce};
5use tinyvec::ArrayVec;
6
7use crate::net::{Addrd, Socket};
8
9pub(super) mod convert;
10
11/// [`UdpSocket`] secured by DTLS
12pub mod secure;
13pub use secure::{Error as SecureSocketError, SecureUdpSocket};
14
15impl Socket for UdpSocket {
16  type Error = io::Error;
17  type Dgram = ArrayVec<[u8; 1152]>;
18
19  fn local_addr(&self) -> no_std_net::SocketAddr {
20    convert::std::SockAddr(self.local_addr().unwrap()).into()
21  }
22
23  fn send(&self, msg: Addrd<&[u8]>) -> nb::Result<(), Self::Error> {
24    self.set_nonblocking(true)
25        .bind(|_| {
26          UdpSocket::send_to::<std::net::SocketAddr>(self,
27                                                     msg.data(),
28                                                     convert::no_std::SockAddr(msg.addr()).into())
29        })
30        .map(|_| ())
31        .map_err(convert::io_to_nb)
32  }
33
34  fn recv(&self, buffer: &mut [u8]) -> nb::Result<Addrd<usize>, Self::Error> {
35    self.set_nonblocking(true).unwrap();
36    self.recv_from(buffer)
37        .map(|(n, addr)| Addrd(n, convert::std::SockAddr(addr).into()))
38        .map_err(convert::io_to_nb)
39  }
40
41  fn bind_raw<A: no_std_net::ToSocketAddrs>(addr: A) -> Result<Self, Self::Error> {
42    let addrs = addr.to_socket_addrs()
43                    .unwrap()
44                    .map(|no_std| convert::no_std::SockAddr(no_std).into())
45                    .collect::<Vec<std::net::SocketAddr>>();
46
47    UdpSocket::bind(addrs.as_slice()).discard(|s: &UdpSocket| Ok(s.set_nonblocking(true).unwrap()))
48  }
49
50  fn join_multicast(&self, addr: no_std_net::IpAddr) -> Result<(), Self::Error> {
51    match convert::std::Ip::from(convert::no_std::Ip(addr)).0 {
52      | std::net::IpAddr::V4(addr) => {
53        self.join_multicast_v4(&addr, &std::net::Ipv4Addr::UNSPECIFIED)
54      },
55      | std::net::IpAddr::V6(addr) => self.join_multicast_v6(&addr, 0),
56    }
57  }
58
59  fn peek(&self, buffer: &mut [u8]) -> nb::Result<Addrd<usize>, Self::Error> {
60    std::net::UdpSocket::peek_from(self, buffer).map(|(n, addr)| {
61                                                  Addrd(n,
62            convert::no_std::SockAddr::from(convert::std::SockAddr(addr)).0)
63                                                })
64                                                .map_err(convert::io_to_nb)
65  }
66
67  fn empty_dgram() -> Self::Dgram {
68    ArrayVec::from([0u8; 1152])
69  }
70}