Struct socket2::SockAddr

source ·
pub struct SockAddr { /* private fields */ }
Expand description

The address of a socket.

SockAddrs 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: sockaddr_storage, 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::mem;
use std::os::unix::io::AsRawFd;

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

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

// Initialise a `SocketAddr` byte calling `getsockname(2)`.
let mut addr_storage: libc::sockaddr_storage = unsafe { mem::zeroed() };
let mut len = mem::size_of_val(&addr_storage) as libc::socklen_t;

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

let address = unsafe { SockAddr::new(addr_storage, len) };
source

pub unsafe fn init<F, T>(init: F) -> Result<(T, SockAddr)>where F: FnOnce(*mut sockaddr_storage, *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::unix::io::AsRawFd;

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

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

// Initialise a `SocketAddr` byte calling `getsockname(2)`.
let (_, address) = unsafe {
    SockAddr::init(|addr_storage, len| {
        // The `getsockname(2)` system call will intiliase `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 const fn family(&self) -> sa_family_t

Returns this address’s family.

source

pub const fn len(&self) -> socklen_t

Returns the size of this address in bytes.

source

pub const fn as_ptr(&self) -> *const sockaddr

Returns a raw pointer to the address.

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 unix<P>(path: P) -> Result<SockAddr>where P: AsRef<Path>,

Available on Unix and crate feature all only.

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

Failure

Returns an error if the path is longer than SUN_LEN.

source§

impl SockAddr

source

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

Available on crate feature all and (Android or Linux) only.

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 vsock_address(&self) -> Option<(u32, u32)>

Available on crate feature all and (Android or Linux) only.

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

Trait Implementations§

source§

impl Clone for SockAddr

source§

fn clone(&self) -> SockAddr

Returns a copy 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.

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

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

Mutably borrows from an owned value. 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 Twhere 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 Twhere T: Clone,

§

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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.