1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//! TCP/UDP 通信的网络原语。
//!
//! 该模块提供了传输控制和用户数据报协议的网络功能,以及 IP 和套接字地址的类型。
//!
//! # Organization
//!
//! * [`TcpListener`] 和 [`TcpStream`] 提供通过 TCP 进行通信的功能
//! * [`UdpSocket`] 提供用于通过 UDP 进行通信的功能
//! * [`IpAddr`] 代表 IPv4 或 IPv6 的 IP 地址; [`Ipv4Addr`] 和 [`Ipv6Addr`] 分别是 IPv4 和 IPv6 地址
//! * [`SocketAddr`] 表示 IPv4 或 IPv6 的套接字地址; [`SocketAddrV4`] 和 [`SocketAddrV6`] 分别是 IPv4 和 IPv6 套接字地址
//! * [`ToSocketAddrs`] 是 trait,用于与 [`TcpListener`],[`TcpStream`] 或 [`UdpSocket`] 等网络对象进行交互时的泛型地址解析
//!
//! * 其他类型是此模块中各种方法的返回值或参数类型
//!
//!
//!

#![stable(feature = "rust1", since = "1.0.0")]

use crate::io::{self, Error, ErrorKind};

#[stable(feature = "rust1", since = "1.0.0")]
pub use self::addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::ip::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope};
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::parser::AddrParseError;
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::tcp::{Incoming, TcpListener, TcpStream};
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::udp::UdpSocket;

mod addr;
mod ip;
mod parser;
mod tcp;
#[cfg(test)]
mod test;
mod udp;

/// 可以传递给 [`TcpStream::shutdown`] 方法的可能值。
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Shutdown {
    /// [`TcpStream`] 的读取部分应关闭。
    ///
    /// 所有当前被阻止的和未来的 [reads] 将返回 [`Ok`]`(0)`。
    ///
    /// [reads]: crate::io::Read
    #[stable(feature = "rust1", since = "1.0.0")]
    Read,
    /// [`TcpStream`] 的写入部分应关闭。
    ///
    /// 所有当前被阻止和未来的 [writes] 将返回错误。
    ///
    /// [writes]: crate::io::Write
    #[stable(feature = "rust1", since = "1.0.0")]
    Write,
    /// [`TcpStream`] 的读取和写入部分均应关闭。
    ///
    /// 有关更多信息,请参见 [`Shutdown::Read`] 和 [`Shutdown::Write`]。
    #[stable(feature = "rust1", since = "1.0.0")]
    Both,
}

#[inline]
const fn htons(i: u16) -> u16 {
    i.to_be()
}
#[inline]
const fn ntohs(i: u16) -> u16 {
    u16::from_be(i)
}

fn each_addr<A: ToSocketAddrs, F, T>(addr: A, mut f: F) -> io::Result<T>
where
    F: FnMut(io::Result<&SocketAddr>) -> io::Result<T>,
{
    let addrs = match addr.to_socket_addrs() {
        Ok(addrs) => addrs,
        Err(e) => return f(Err(e)),
    };
    let mut last_err = None;
    for addr in addrs {
        match f(Ok(&addr)) {
            Ok(l) => return Ok(l),
            Err(e) => last_err = Some(e),
        }
    }
    Err(last_err.unwrap_or_else(|| {
        Error::new_const(ErrorKind::InvalidInput, &"could not resolve to any addresses")
    }))
}