## SockAddr

# Struct SockAddr

Source

    pub struct SockAddr { /* private fields */ }

Expand description

The address of a socket.

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

## Implementations§

Source§

### impl SockAddr

Source

#### pub 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

    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) };

Source

#### pub 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

    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(())
            }
        })
    }?;

Source

#### pub 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`.

Source

#### pub 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.

Source

#### pub const fn family(&self) -> sa_family_t

Returns this address’s family.

Source

#### pub const fn domain(&self) -> Domain

Returns this address’s `Domain`.

Source

#### pub const fn len(&self) -> socklen_t

Returns the size of this address in bytes.

Source

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

Returns a raw pointer to the address.

Source

#### pub const fn as_storage(self) -> SockAddrStorage

Returns the address as the storage.

Source

#### pub const fn is_ipv4(&self) -> bool

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

Source

#### pub const fn is_ipv6(&self) -> bool

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

Source

#### pub 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.

Source

#### pub 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`.

Source

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

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

Source

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

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

Source§

### impl SockAddr

Unix only API.

Source

#### pub 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.

Source

#### pub 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`.

Source

#### pub 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.

Source

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

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

Source

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

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

Source

#### pub 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.

## Trait Implementations§

Source§

### impl Clone for SockAddr

Source§

#### fn clone(&self) -> SockAddr

Returns a duplicate of the value. Read more
1.0.0 · Source§

#### fn clone_from(&mut self, source: &Self)

Performs copy-assignment from `source`. Read more
Source§

### impl Debug for SockAddr

Source§

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

Formats the value using the given formatter. Read more
Source§

### impl From<SocketAddr> for SockAddr

Source§

#### fn from(addr: SocketAddr) -> SockAddr

Converts to this type from the input type.
Source§

### impl From<SocketAddrV4> for SockAddr

Source§

#### fn from(addr: SocketAddrV4) -> SockAddr

Converts to this type from the input type.
Source§

### impl From<SocketAddrV6> for SockAddr

Source§

#### fn from(addr: SocketAddrV6) -> SockAddr

Converts to this type from the input type.
Source§

### impl Hash for SockAddr

Source§

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

Feeds this value into the given `Hasher`. Read more
1.3.0 · Source§

#### fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given `Hasher`. Read more
Source§

### impl PartialEq for SockAddr

Source§

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

Tests for `self` and `other` values to be equal, and is used by `==`.
1.0.0 · Source§

#### fn ne(&self, other: &Rhs) -> bool

Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

### impl Eq for SockAddr

## Auto Trait Implementations§

§

### impl Freeze for SockAddr

§

### impl RefUnwindSafe for SockAddr

§

### impl Send for SockAddr

§

### impl Sync for SockAddr

§

### impl Unpin for SockAddr

§

### impl UnwindSafe for SockAddr

## Blanket Implementations§

Source§

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

Source§

#### fn type_id(&self) -> TypeId

Gets the `TypeId` of `self`. Read more
Source§

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

Source§

#### fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

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

Source§

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

🔬This is a nightly-only experimental API. (`clone_to_uninit`)
Performs copy-assignment from `self` to `dest`. Read more
Source§

### impl<T> From<T> for T

Source§

#### fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

#### fn into(self) -> U

Calls `U::from(self)`.

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

Source§

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

Source§

#### type Owned = T

The resulting type after obtaining ownership.
Source§

#### fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

#### fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

#### type Error = Infallible

The type returned in the event of a conversion error.
Source§

#### fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

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

Source§

#### type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.