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
11pub 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}