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
//! Linux 和特定于 Android 的套接字地址扩展。
use crate::os::unix::net::SocketAddr;
use crate::sealed::Sealed;
/// [`SocketAddr`] 的平台特定扩展。
#[stable(feature = "unix_socket_abstract", since = "1.70.0")]
pub trait SocketAddrExt: Sealed {
/// 在抽象命名空间中创建一个 Unix 套接字地址。
///
/// 抽象名称空间是特定于 Linux 的扩展,它允许在不在文件系统中创建条目的情况下绑定 Unix 套接字。
///
/// 抽象套接字不受文件系统布局或权限的影响,并且在套接字关闭时不需要清理。
///
/// 抽象套接字地址名称可以包含任何字节,包括零。
///
/// # Errors
///
/// 如果名称长于 `SUN_LEN - 1`,则返回错误。
///
/// # Examples
///
/// ```no_run
/// use std::os::unix::net::{UnixListener, SocketAddr};
/// use std::os::linux::net::SocketAddrExt;
///
/// fn main() -> std::io::Result<()> {
/// let addr = SocketAddr::from_abstract_name(b"hidden")?;
/// let listener = match UnixListener::bind_addr(&addr) {
/// Ok(sock) => sock,
/// Err(err) => {
/// println!("Couldn't bind: {err:?}");
/// return Err(err);
/// }
/// };
/// Ok(())
/// }
/// ```
///
#[stable(feature = "unix_socket_abstract", since = "1.70.0")]
fn from_abstract_name<N>(name: N) -> crate::io::Result<SocketAddr>
where
N: AsRef<[u8]>;
/// 如果该地址位于抽象命名空间中,则返回该地址的内容。
///
/// # Examples
///
/// ```no_run
/// use std::os::unix::net::{UnixListener, SocketAddr};
/// use std::os::linux::net::SocketAddrExt;
///
/// fn main() -> std::io::Result<()> {
/// let name = b"hidden";
/// let name_addr = SocketAddr::from_abstract_name(name)?;
/// let socket = UnixListener::bind_addr(&name_addr)?;
/// let local_addr = socket.local_addr().expect("Couldn't get local address");
/// assert_eq!(local_addr.as_abstract_name(), Some(&name[..]));
/// Ok(())
/// }
/// ```
#[stable(feature = "unix_socket_abstract", since = "1.70.0")]
fn as_abstract_name(&self) -> Option<&[u8]>;
}