Struct SockAddr

pub struct SockAddr { /* private fields */ }

The address of a socket.

SockAddrs may be constructed directly to and from the standard library SocketAddr, SocketAddrV4, and SocketAddrV6 types.

Implementations

impl SockAddr

fn is_unnamed(&self) -> bool

Returns true if this address is an unnamed address from the AF_UNIX family (for local interprocess communication), false otherwise.

fn as_unix(&self) -> Option<SocketAddr>

Returns this address as Unix SocketAddr if it is an AF_UNIX pathname address, otherwise returns None.

fn as_pathname(&self) -> Option<&Path>

Returns this address as a Path reference if it is an AF_UNIX pathname address, otherwise returns None.

fn as_abstract_namespace(&self) -> Option<&[u8]>

Returns this address as a slice of bytes representing an abstract address if it is an AF_UNIX abstract address, otherwise returns None.

Abstract addresses are a Linux extension, so this method returns None on all non-Linux platforms.

impl SockAddr

fn vsock(cid: u32, port: u32) -> SockAddr

Constructs a SockAddr with the family AF_VSOCK and the provided CID/port.

Errors

This function can never fail. In a future version of this library it will be made infallible.

fn as_vsock_address(&self) -> Option<(u32, u32)>

Returns this address VSOCK CID/port if it is in the AF_VSOCK family, otherwise return None.

impl SockAddr

const unsafe fn new(storage: SockAddrStorage, len: socklen_t) -> SockAddr

Create a SockAddr from the underlying storage and its length.

Safety

Caller must ensure that the address family and length match the type of storage address. For example if storage.ss_family is set to AF_INET the storage must be initialised as sockaddr_in, setting the content and length appropriately.

Examples

# fn main() -> std::io::Result<()> {
# #[cfg(unix)] {
use std::io;
use std::os::fd::AsRawFd;

use socket2::{SockAddr, SockAddrStorage, Socket, Domain, Type};

let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?;

// Initialise a `SocketAddr` by calling `getsockname(2)`.
let mut addr_storage = SockAddrStorage::zeroed();
let mut len = addr_storage.size_of();

// The `getsockname(2)` system call will initialize `storage` for
// us, setting `len` to the correct length.
let res = unsafe {
    libc::getsockname(
        socket.as_raw_fd(),
        addr_storage.view_as(),
        &mut len,
    )
};
if res == -1 {
    return Err(io::Error::last_os_error());
}

let address = unsafe { SockAddr::new(addr_storage, len) };
# drop(address);
# }
# Ok(())
# }
unsafe fn try_init<F, T>(init: F) -> Result<(T, SockAddr)>
where
    F: FnOnce(*mut SockAddrStorage, *mut socklen_t) -> Result<T>,

Initialise a SockAddr by calling the function init.

The type of the address storage and length passed to the function init is OS/architecture specific.

The address is zeroed before init is called and is thus valid to dereference and read from. The length initialised to the maximum length of the storage.

Safety

Caller must ensure that the address family and length match the type of storage address. For example if storage.ss_family is set to AF_INET the storage must be initialised as sockaddr_in, setting the content and length appropriately.

Examples

# fn main() -> std::io::Result<()> {
# #[cfg(unix)] {
use std::io;
use std::os::fd::AsRawFd;

use socket2::{SockAddr, Socket, Domain, Type};

let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?;

// Initialise a `SocketAddr` by calling `getsockname(2)`.
let (_, address) = unsafe {
    SockAddr::try_init(|addr_storage, len| {
        // The `getsockname(2)` system call will initialize `storage` for
        // us, setting `len` to the correct length.
        if libc::getsockname(socket.as_raw_fd(), addr_storage.cast(), len) == -1 {
            Err(io::Error::last_os_error())
        } else {
            Ok(())
        }
    })
}?;
# drop(address);
# }
# Ok(())
# }
fn unix<P>(path: P) -> Result<SockAddr>
where
    P: AsRef<Path>,

Constructs a SockAddr with the family AF_UNIX and the provided path.

Returns an error if the path is longer than SUN_LEN.

unsafe fn set_length(&mut self, length: socklen_t)

Set the length of the address.

Safety

Caller must ensure that the address up to length bytes are properly initialised.

const fn family(&self) -> sa_family_t

Returns this address's family.

const fn domain(&self) -> Domain

Returns this address's Domain.

const fn len(&self) -> socklen_t

Returns the size of this address in bytes.

const fn as_ptr(&self) -> *const SockAddrStorage

Returns a raw pointer to the address.

const fn as_storage(self) -> SockAddrStorage

Returns the address as the storage.

const fn is_ipv4(&self) -> bool

Returns true if this address is in the AF_INET (IPv4) family, false otherwise.

const fn is_ipv6(&self) -> bool

Returns true if this address is in the AF_INET6 (IPv6) family, false otherwise.

fn is_unix(&self) -> bool

Returns true if this address is of a unix socket (for local interprocess communication), i.e. it is from the AF_UNIX family, false otherwise.

fn as_socket(&self) -> Option<SocketAddr>

Returns this address as a SocketAddr if it is in the AF_INET (IPv4) or AF_INET6 (IPv6) family, otherwise returns None.

fn as_socket_ipv4(&self) -> Option<SocketAddrV4>

Returns this address as a SocketAddrV4 if it is in the AF_INET family.

fn as_socket_ipv6(&self) -> Option<SocketAddrV6>

Returns this address as a SocketAddrV6 if it is in the AF_INET6 family.

Trait Implementations

impl Clone for SockAddr

fn clone(&self) -> SockAddr

impl Debug for SockAddr

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

impl Eq for SockAddr

impl From<SocketAddr> for SockAddr

fn from(addr: SocketAddr) -> SockAddr

impl From<SocketAddrV4> for SockAddr

fn from(addr: SocketAddrV4) -> SockAddr

impl From<SocketAddrV6> for SockAddr

fn from(addr: SocketAddrV6) -> SockAddr

impl Hash for SockAddr

fn hash<H: Hasher>(&self, state: &mut H)

impl PartialEq for SockAddr

fn eq(&self, other: &Self) -> bool

Auto Trait Implementations

impl Freeze for SockAddr

impl RefUnwindSafe for SockAddr

impl Send for SockAddr

impl Sync for SockAddr

impl Unpin for SockAddr

impl UnsafeUnpin for SockAddr

impl UnwindSafe for SockAddr

Blanket Implementations

impl<T> Any for SockAddr where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for SockAddr where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for SockAddr where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for SockAddr where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for SockAddr

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for SockAddr where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T, U> Into<U> for SockAddr where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for SockAddr where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for SockAddr where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>