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
//! 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`] is a trait that is used for generic address resolution when interacting with networking objects like [`TcpListener`], [`TcpStream`] or [`UdpSocket`]
//!
//! * 其他类型是此模块中各种方法的返回值或参数类型
//!
//! Rust 在可能的情况下默认禁用套接字对象对子进程的继承。
//! 例如,通过在 UNIX 系统中使用 `CLOEXEC` 标志或在 Windows 上使用 `HANDLE_FLAG_INHERIT` 标志。
//!
//!
//!
//!
#![stable(feature = "rust1", since = "1.0.0")]
use crate::io::{self, ErrorKind};
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::ip_addr::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope};
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::socket_addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
#[unstable(feature = "tcplistener_into_incoming", issue = "88339")]
pub use self::tcp::IntoIncoming;
#[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;
#[stable(feature = "rust1", since = "1.0.0")]
pub use core::net::AddrParseError;
mod ip_addr;
mod socket_addr;
mod tcp;
#[cfg(test)]
pub(crate) mod test;
mod udp;
/// 可以传递给 [`TcpStream::shutdown`] 方法的可能值。
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Shutdown {
/// [`TcpStream`] 的读取部分应关闭。
///
/// 所有当前被阻止的和未来的 [reads] 将返回 <code>[Ok]\(0)</code>。
///
/// [reads]: crate::io::Read "io::Read"
#[stable(feature = "rust1", since = "1.0.0")]
Read,
/// [`TcpStream`] 的写入部分应关闭。
///
/// 所有当前被阻止和未来的 [写入][writes] 将返回错误。
///
/// [writes]: crate::io::Write "io::Write"
#[stable(feature = "rust1", since = "1.0.0")]
Write,
/// [`TcpStream`] 的读取和写入部分均应关闭。
///
/// 有关更多信息,请参见 [`Shutdown::Read`] 和 [`Shutdown::Write`]。
#[stable(feature = "rust1", since = "1.0.0")]
Both,
}
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(|| {
io::const_io_error!(ErrorKind::InvalidInput, "could not resolve to any addresses")
}))
}