axstd/net/
mod.rs

1//! Networking primitives for TCP/UDP communication.
2//!
3//! This module provides networking functionality for the Transmission Control and User
4//! Datagram Protocols, as well as types for IP and socket addresses.
5//!
6//! # Organization
7//!
8//! * [`TcpListener`] and [`TcpStream`] provide functionality for communication over TCP
9//! * [`UdpSocket`] provides functionality for communication over UDP
10//! * [`IpAddr`] represents IP addresses of either IPv4 or IPv6; [`Ipv4Addr`] and
11//!   [`Ipv6Addr`] are respectively IPv4 and IPv6 addresses
12//! * [`SocketAddr`] represents socket addresses of either IPv4 or IPv6; [`SocketAddrV4`]
13//!   and [`SocketAddrV6`] are respectively IPv4 and IPv6 socket addresses
14//! * [`ToSocketAddrs`] is a trait that is used for generic address resolution when interacting
15//!   with networking objects like [`TcpListener`], [`TcpStream`] or [`UdpSocket`]
16
17mod socket_addr;
18mod tcp;
19mod udp;
20
21pub use self::socket_addr::{IpAddr, Ipv4Addr, Ipv6Addr};
22pub use self::socket_addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
23pub use self::tcp::{TcpListener, TcpStream};
24pub use self::udp::UdpSocket;
25
26use crate::io;
27
28fn each_addr<A: ToSocketAddrs, F, T>(addr: A, mut f: F) -> io::Result<T>
29where
30    F: FnMut(io::Result<&SocketAddr>) -> io::Result<T>,
31{
32    let addrs = match addr.to_socket_addrs() {
33        Ok(addrs) => addrs,
34        Err(e) => return f(Err(e)),
35    };
36    let mut last_err = None;
37    for addr in addrs {
38        match f(Ok(&addr)) {
39            Ok(l) => return Ok(l),
40            Err(e) => last_err = Some(e),
41        }
42    }
43    Err(last_err.unwrap_or_else(|| {
44        axerrno::ax_err_type!(InvalidInput, "could not resolve to any addresses")
45    }))
46}