Struct UnixDatagram
pub struct UnixDatagram(pub(in ::os::unix::net::datagram) Socket);
A Unix datagram socket.
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::bind("/path/to/my/socket")?;
socket.send_to(b"hello world", "/path/to/other/socket")?;
let mut buf = [0; 100];
let (count, address) = socket.recv_from(&mut buf)?;
println!("socket {:?} sent {:?}", address, &buf[..count]);
Ok(())
}
Fields
0: Socket
Implementations
impl UnixDatagram
fn bind<P: AsRef<Path>>(path: P) -> Result<UnixDatagram>Creates a Unix datagram socket bound to the given path.
Examples
use std::os::unix::net::UnixDatagram; let sock = match UnixDatagram::bind("/path/to/the/socket") { Ok(sock) => sock, Err(e) => { println!("Couldn't bind: {e:?}"); return } };fn bind_addr(socket_addr: &SocketAddr) -> Result<UnixDatagram>Creates a Unix datagram socket bound to an address.
Examples
use std::os::unix::net::{UnixDatagram}; fn main() -> std::io::Result<()> { let sock1 = UnixDatagram::bind("path/to/socket")?; let addr = sock1.local_addr()?; let sock2 = match UnixDatagram::bind_addr(&addr) { Ok(sock) => sock, Err(err) => { println!("Couldn't bind: {err:?}"); return Err(err); } }; Ok(()) }fn unbound() -> Result<UnixDatagram>Creates a Unix Datagram socket which is not bound to any address.
Examples
use std::os::unix::net::UnixDatagram; let sock = match UnixDatagram::unbound() { Ok(sock) => sock, Err(e) => { println!("Couldn't unbound: {e:?}"); return } };fn pair() -> Result<(UnixDatagram, UnixDatagram)>Creates an unnamed pair of connected sockets.
Returns two
UnixDatagramss which are connected to each other.Examples
use std::os::unix::net::UnixDatagram; let (sock1, sock2) = match UnixDatagram::pair() { Ok((sock1, sock2)) => (sock1, sock2), Err(e) => { println!("Couldn't unbound: {e:?}"); return } };fn connect<P: AsRef<Path>>(&self, path: P) -> Result<()>Connects the socket to the specified path address.
The
sendmethod may be used to send data to the specified address.recvandrecv_fromwill only receive data from that address.Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; match sock.connect("/path/to/the/socket") { Ok(sock) => sock, Err(e) => { println!("Couldn't connect: {e:?}"); return Err(e) } }; Ok(()) }fn connect_addr(&self, socket_addr: &SocketAddr) -> Result<()>Connects the socket to an address.
Examples
use std::os::unix::net::{UnixDatagram}; fn main() -> std::io::Result<()> { let bound = UnixDatagram::bind("/path/to/socket")?; let addr = bound.local_addr()?; let sock = UnixDatagram::unbound()?; match sock.connect_addr(&addr) { Ok(sock) => sock, Err(e) => { println!("Couldn't connect: {e:?}"); return Err(e) } }; Ok(()) }fn try_clone(&self) -> Result<UnixDatagram>Creates a new independently owned handle to the underlying socket.
The returned
UnixDatagramis a reference to the same socket that this object references. Both handles can be used to accept incoming connections and options set on one side will affect the other.Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::bind("/path/to/the/socket")?; let sock_copy = sock.try_clone().expect("try_clone failed"); Ok(()) }fn local_addr(&self) -> Result<SocketAddr>Returns the address of this socket.
Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::bind("/path/to/the/socket")?; let addr = sock.local_addr().expect("Couldn't get local address"); Ok(()) }fn peer_addr(&self) -> Result<SocketAddr>Returns the address of this socket's peer.
The
connectmethod will connect the socket to a peer.Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; sock.connect("/path/to/the/socket")?; let addr = sock.peer_addr().expect("Couldn't get peer address"); Ok(()) }fn recv_from_flags(&self, buf: &mut [u8], flags: c_int) -> Result<(usize, SocketAddr)>fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>Receives data from the socket.
On success, returns the number of bytes read and the address from whence the data came.
Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; let mut buf = vec![0; 10]; let (size, sender) = sock.recv_from(buf.as_mut_slice())?; println!("received {size} bytes from {sender:?}"); Ok(()) }fn recv(&self, buf: &mut [u8]) -> Result<usize>Receives data from the socket.
On success, returns the number of bytes read.
Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::bind("/path/to/the/socket")?; let mut buf = vec![0; 10]; sock.recv(buf.as_mut_slice()).expect("recv function failed"); Ok(()) }fn recv_vectored_with_ancillary_from(&self, bufs: &mut [IoSliceMut<'_>], ancillary: &mut SocketAncillary<'_>) -> Result<(usize, bool, SocketAddr)>Receives data and ancillary data from socket.
On success, returns the number of bytes read, if the data was truncated and the address from whence the msg came.
Examples
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixDatagram, SocketAncillary, AncillaryData}; use std::io::IoSliceMut; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; let mut buf1 = [1; 8]; let mut buf2 = [2; 16]; let mut buf3 = [3; 8]; let mut bufs = &mut [ IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2), IoSliceMut::new(&mut buf3), ][..]; let mut fds = [0; 8]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); let (size, _truncated, sender) = sock.recv_vectored_with_ancillary_from(bufs, &mut ancillary)?; println!("received {size}"); for ancillary_result in ancillary.messages() { if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { for fd in scm_rights { println!("receive file descriptor: {fd}"); } } } Ok(()) }fn recv_vectored_with_ancillary(&self, bufs: &mut [IoSliceMut<'_>], ancillary: &mut SocketAncillary<'_>) -> Result<(usize, bool)>Receives data and ancillary data from socket.
On success, returns the number of bytes read and if the data was truncated.
Examples
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixDatagram, SocketAncillary, AncillaryData}; use std::io::IoSliceMut; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; let mut buf1 = [1; 8]; let mut buf2 = [2; 16]; let mut buf3 = [3; 8]; let mut bufs = &mut [ IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2), IoSliceMut::new(&mut buf3), ][..]; let mut fds = [0; 8]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); let (size, _truncated) = sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?; println!("received {size}"); for ancillary_result in ancillary.messages() { if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { for fd in scm_rights { println!("receive file descriptor: {fd}"); } } } Ok(()) }fn send_to<P: AsRef<Path>>(&self, buf: &[u8], path: P) -> Result<usize>Sends data on the socket to the specified address.
On success, returns the number of bytes written.
Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; sock.send_to(b"omelette au fromage", "/some/sock").expect("send_to function failed"); Ok(()) }fn send_to_addr(&self, buf: &[u8], socket_addr: &SocketAddr) -> Result<usize>Sends data on the socket to the specified SocketAddr.
On success, returns the number of bytes written.
Examples
use std::os::unix::net::{UnixDatagram}; fn main() -> std::io::Result<()> { let bound = UnixDatagram::bind("/path/to/socket")?; let addr = bound.local_addr()?; let sock = UnixDatagram::unbound()?; sock.send_to_addr(b"bacon egg and cheese", &addr).expect("send_to_addr function failed"); Ok(()) }fn send(&self, buf: &[u8]) -> Result<usize>Sends data on the socket to the socket's peer.
The peer address may be set by the
connectmethod, and this method will return an error if the socket has not already been connected.On success, returns the number of bytes written.
Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; sock.connect("/some/sock").expect("Couldn't connect"); sock.send(b"omelette au fromage").expect("send_to function failed"); Ok(()) }fn send_vectored_with_ancillary_to<P: AsRef<Path>>(&self, bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, path: P) -> Result<usize>Sends data and ancillary data on the socket to the specified address.
On success, returns the number of bytes written.
Examples
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixDatagram, SocketAncillary}; use std::io::IoSlice; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; let buf1 = [1; 8]; let buf2 = [2; 16]; let buf3 = [3; 8]; let bufs = &[ IoSlice::new(&buf1), IoSlice::new(&buf2), IoSlice::new(&buf3), ][..]; let fds = [0, 1, 2]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); ancillary.add_fds(&fds[..]); sock.send_vectored_with_ancillary_to(bufs, &mut ancillary, "/some/sock") .expect("send_vectored_with_ancillary_to function failed"); Ok(()) }fn send_vectored_with_ancillary(&self, bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>) -> Result<usize>Sends data and ancillary data on the socket.
On success, returns the number of bytes written.
Examples
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixDatagram, SocketAncillary}; use std::io::IoSlice; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; let buf1 = [1; 8]; let buf2 = [2; 16]; let buf3 = [3; 8]; let bufs = &[ IoSlice::new(&buf1), IoSlice::new(&buf2), IoSlice::new(&buf3), ][..]; let fds = [0, 1, 2]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); ancillary.add_fds(&fds[..]); sock.send_vectored_with_ancillary(bufs, &mut ancillary) .expect("send_vectored_with_ancillary function failed"); Ok(()) }fn set_read_timeout(&self, timeout: Option<Duration>) -> Result<()>Sets the read timeout for the socket.
If the provided value is
None, thenrecvandrecv_fromcalls will block indefinitely. AnErris returned if the zeroDurationis passed to this method.Examples
use UnixDatagram; use Duration;An
Erris returned if the zeroDurationis passed to this method:use std::io; use std::os::unix::net::UnixDatagram; use std::time::Duration; fn main() -> std::io::Result<()> { let socket = UnixDatagram::unbound()?; let result = socket.set_read_timeout(Some(Duration::new(0, 0))); let err = result.unwrap_err(); assert_eq!(err.kind(), io::ErrorKind::InvalidInput); Ok(()) }fn set_write_timeout(&self, timeout: Option<Duration>) -> Result<()>Sets the write timeout for the socket.
If the provided value is
None, thensendandsend_tocalls will block indefinitely. AnErris returned if the zeroDurationis passed to this method.Examples
use UnixDatagram; use Duration;An
Erris returned if the zeroDurationis passed to this method:use std::io; use std::os::unix::net::UnixDatagram; use std::time::Duration; fn main() -> std::io::Result<()> { let socket = UnixDatagram::unbound()?; let result = socket.set_write_timeout(Some(Duration::new(0, 0))); let err = result.unwrap_err(); assert_eq!(err.kind(), io::ErrorKind::InvalidInput); Ok(()) }fn read_timeout(&self) -> Result<Option<Duration>>Returns the read timeout of this socket.
Examples
use UnixDatagram; use Duration;fn write_timeout(&self) -> Result<Option<Duration>>Returns the write timeout of this socket.
Examples
use UnixDatagram; use Duration;fn set_nonblocking(&self, nonblocking: bool) -> Result<()>Moves the socket into or out of nonblocking mode.
Examples
use UnixDatagram;fn set_mark(&self, mark: u32) -> Result<()>Set the id of the socket for network filtering purpose
#![feature(unix_set_mark)] use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; sock.set_mark(32)?; Ok(()) }fn take_error(&self) -> Result<Option<Error>>Returns the value of the
SO_ERRORoption.Examples
use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; if let Ok(Some(err)) = sock.take_error() { println!("Got error: {err:?}"); } Ok(()) }fn shutdown(&self, how: Shutdown) -> Result<()>Shut down the read, write, or both halves of this connection.
This function will cause all pending and future I/O calls on the specified portions to immediately return with an appropriate value (see the documentation of
Shutdown).use std::os::unix::net::UnixDatagram; use std::net::Shutdown; fn main() -> std::io::Result<()> { let sock = UnixDatagram::unbound()?; sock.shutdown(Shutdown::Both).expect("shutdown function failed"); Ok(()) }fn peek(&self, buf: &mut [u8]) -> Result<usize>Receives data on the socket from the remote address to which it is connected, without removing that data from the queue. On success, returns the number of bytes peeked.
Successive calls return the same data. This is accomplished by passing
MSG_PEEKas a flag to the underlyingrecvsystem call.Examples
#![feature(unix_socket_peek)] use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let socket = UnixDatagram::bind("/tmp/sock")?; let mut buf = [0; 10]; let len = socket.peek(&mut buf).expect("peek failed"); Ok(()) }fn peek_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>Receives a single datagram message on the socket, without removing it from the queue. On success, returns the number of bytes read and the origin.
The function must be called with valid byte array
bufof sufficient size to hold the message bytes. If a message is too long to fit in the supplied buffer, excess bytes may be discarded.Successive calls return the same data. This is accomplished by passing
MSG_PEEKas a flag to the underlyingrecvfromsystem call.Do not use this function to implement busy waiting, instead use
libc::pollto synchronize IO events on one or more sockets.Examples
#![feature(unix_socket_peek)] use std::os::unix::net::UnixDatagram; fn main() -> std::io::Result<()> { let socket = UnixDatagram::bind("/tmp/sock")?; let mut buf = [0; 10]; let (len, addr) = socket.peek_from(&mut buf).expect("peek failed"); Ok(()) }
Trait Implementations
impl AsFd for UnixDatagram
fn as_fd(&self) -> BorrowedFd<'_>
impl AsInner<Socket> for UnixDatagram
fn as_inner(&self) -> &Socket
impl AsRawFd for UnixDatagram
fn as_raw_fd(&self) -> RawFd
impl Debug for UnixDatagram
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result
impl From<OwnedFd> for UnixDatagram
fn from(owned: OwnedFd) -> Self
impl FromRawFd for UnixDatagram
unsafe fn from_raw_fd(fd: RawFd) -> UnixDatagram
impl IntoRawFd for UnixDatagram
fn into_raw_fd(self) -> RawFd
impl UnixSocketExt for UnixDatagram
fn passcred(&self) -> Result<bool>fn set_passcred(&self, passcred: bool) -> Result<()>
Auto Trait Implementations
impl Freeze for UnixDatagram
impl RefUnwindSafe for UnixDatagram
impl Send for UnixDatagram
impl Sync for UnixDatagram
impl Unpin for UnixDatagram
impl UnsafeUnpin for UnixDatagram
impl UnwindSafe for UnixDatagram
Blanket Implementations
impl<T> Any for UnixDatagram
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for UnixDatagram
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for UnixDatagram
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> From<T> for UnixDatagram
fn from(t: T) -> TReturns the argument unchanged.
impl<T> SizeHint for UnixDatagram
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for UnixDatagram
impl<T, U> Into<U> for UnixDatagram
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for UnixDatagram
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for UnixDatagram
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>