pub struct UnixDatagram(_);Expand description
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(())
}RunImplementations
impl UnixDatagram
source
impl UnixDatagram
sourcepub fn bind_addr(socket_addr: &SocketAddr) -> Result<UnixDatagram>
source
pub fn bind_addr(socket_addr: &SocketAddr) -> Result<UnixDatagram>
sourceCreates a Unix datagram socket bound to an address.
Examples
#![feature(unix_socket_abstract)]
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(())
}Runpub fn unbound() -> Result<UnixDatagram>
source
pub fn unbound() -> Result<UnixDatagram>
sourcepub fn pair() -> Result<(UnixDatagram, UnixDatagram)>
source
pub fn pair() -> Result<(UnixDatagram, UnixDatagram)>
sourceCreates 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
}
};Runpub fn connect<P: AsRef<Path>>(&self, path: P) -> Result<()>
source
pub fn connect<P: AsRef<Path>>(&self, path: P) -> Result<()>
sourceConnects the socket to the specified path address.
The send method may be used to send data to the specified address.
recv and recv_from will 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(())
}Runpub fn connect_addr(&self, socket_addr: &SocketAddr) -> Result<()>
source
pub fn connect_addr(&self, socket_addr: &SocketAddr) -> Result<()>
sourceConnects the socket to an address.
Examples
#![feature(unix_socket_abstract)]
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(())
}Runpub fn try_clone(&self) -> Result<UnixDatagram>
source
pub fn try_clone(&self) -> Result<UnixDatagram>
sourceCreates a new independently owned handle to the underlying socket.
The returned UnixDatagram is 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(())
}Runpub fn local_addr(&self) -> Result<SocketAddr>
source
pub fn local_addr(&self) -> Result<SocketAddr>
sourcepub fn peer_addr(&self) -> Result<SocketAddr>
source
pub fn peer_addr(&self) -> Result<SocketAddr>
sourceReturns the address of this socket’s peer.
The connect method 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(())
}Runpub fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
source
pub fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
sourceReceives 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(())
}Runpub fn recv(&self, buf: &mut [u8]) -> Result<usize>
source
pub fn recv(&self, buf: &mut [u8]) -> Result<usize>
sourceReceives 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(())
}Runpub fn recv_vectored_with_ancillary_from(
&self,
bufs: &mut [IoSliceMut<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<(usize, bool, SocketAddr)>
source
pub fn recv_vectored_with_ancillary_from(
&self,
bufs: &mut [IoSliceMut<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<(usize, bool, SocketAddr)>
sourceReceives 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(())
}Runpub fn recv_vectored_with_ancillary(
&self,
bufs: &mut [IoSliceMut<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<(usize, bool)>
source
pub fn recv_vectored_with_ancillary(
&self,
bufs: &mut [IoSliceMut<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<(usize, bool)>
sourceReceives 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(())
}Runpub fn send_to<P: AsRef<Path>>(&self, buf: &[u8], path: P) -> Result<usize>
source
pub fn send_to<P: AsRef<Path>>(&self, buf: &[u8], path: P) -> Result<usize>
sourceSends 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(())
}Runpub fn send_to_addr(
&self,
buf: &[u8],
socket_addr: &SocketAddr
) -> Result<usize>
source
pub fn send_to_addr(
&self,
buf: &[u8],
socket_addr: &SocketAddr
) -> Result<usize>
sourceSends data on the socket to the specified SocketAddr.
On success, returns the number of bytes written.
Examples
#![feature(unix_socket_abstract)]
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(())
}Runpub fn send(&self, buf: &[u8]) -> Result<usize>
source
pub fn send(&self, buf: &[u8]) -> Result<usize>
sourceSends data on the socket to the socket’s peer.
The peer address may be set by the connect method, 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(())
}Runpub fn send_vectored_with_ancillary_to<P: AsRef<Path>>(
&self,
bufs: &[IoSlice<'_>],
ancillary: &mut SocketAncillary<'_>,
path: P
) -> Result<usize>
source
pub fn send_vectored_with_ancillary_to<P: AsRef<Path>>(
&self,
bufs: &[IoSlice<'_>],
ancillary: &mut SocketAncillary<'_>,
path: P
) -> Result<usize>
sourceSends 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(())
}Runpub fn send_vectored_with_ancillary(
&self,
bufs: &[IoSlice<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<usize>
source
pub fn send_vectored_with_ancillary(
&self,
bufs: &[IoSlice<'_>],
ancillary: &mut SocketAncillary<'_>
) -> Result<usize>
sourceSends 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(())
}Runpub fn set_read_timeout(&self, timeout: Option<Duration>) -> Result<()>
source
pub fn set_read_timeout(&self, timeout: Option<Duration>) -> Result<()>
sourceSets the read timeout for the socket.
If the provided value is None, then recv and recv_from calls will
block indefinitely. An Err is returned if the zero Duration
is passed to this method.
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_read_timeout(Some(Duration::new(1, 0)))
.expect("set_read_timeout function failed");
Ok(())
}RunAn Err is returned if the zero Duration is 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(())
}Runpub fn set_write_timeout(&self, timeout: Option<Duration>) -> Result<()>
source
pub fn set_write_timeout(&self, timeout: Option<Duration>) -> Result<()>
sourceSets the write timeout for the socket.
If the provided value is None, then send and send_to calls will
block indefinitely. An Err is returned if the zero Duration is passed to this
method.
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_write_timeout(Some(Duration::new(1, 0)))
.expect("set_write_timeout function failed");
Ok(())
}RunAn Err is returned if the zero Duration is 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(())
}Runpub fn read_timeout(&self) -> Result<Option<Duration>>
source
pub fn read_timeout(&self) -> Result<Option<Duration>>
sourceReturns the read timeout of this socket.
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_read_timeout(Some(Duration::new(1, 0)))
.expect("set_read_timeout function failed");
assert_eq!(sock.read_timeout()?, Some(Duration::new(1, 0)));
Ok(())
}Runpub fn write_timeout(&self) -> Result<Option<Duration>>
source
pub fn write_timeout(&self) -> Result<Option<Duration>>
sourceReturns the write timeout of this socket.
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_write_timeout(Some(Duration::new(1, 0)))
.expect("set_write_timeout function failed");
assert_eq!(sock.write_timeout()?, Some(Duration::new(1, 0)));
Ok(())
}Runpub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
source
pub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
sourcepub fn set_passcred(&self, passcred: bool) -> Result<()>
source
pub fn set_passcred(&self, passcred: bool) -> Result<()>
sourceMoves the socket to pass unix credentials as control message in SocketAncillary.
Set the socket option SO_PASSCRED.
Examples
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_passcred(true).expect("set_passcred function failed");
Ok(())
}Runpub fn passcred(&self) -> Result<bool>
source
pub fn passcred(&self) -> Result<bool>
sourceGet the current value of the socket for passing unix credentials in SocketAncillary.
This value can be change by set_passcred.
Get the socket option SO_PASSCRED.
pub fn take_error(&self) -> Result<Option<Error>>
source
pub fn take_error(&self) -> Result<Option<Error>>
sourcepub fn shutdown(&self, how: Shutdown) -> Result<()>
source
pub fn shutdown(&self, how: Shutdown) -> Result<()>
sourceShut 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(())
}Runpub fn peek(&self, buf: &mut [u8]) -> Result<usize>
source
pub fn peek(&self, buf: &mut [u8]) -> Result<usize>
sourceReceives 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_PEEK as a flag to the underlying recv system 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(())
}Runpub fn peek_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
source
pub fn peek_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>
sourceReceives 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 buf of 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_PEEK as a flag to the underlying recvfrom system call.
Do not use this function to implement busy waiting, instead use libc::poll to
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(())
}RunTrait Implementations
impl AsFd for UnixDatagram
source
impl AsFd for UnixDatagram
sourceimpl AsRawFd for UnixDatagram
source
impl AsRawFd for UnixDatagram
sourceimpl Debug for UnixDatagram
source
impl Debug for UnixDatagram
sourceimpl From<OwnedFd> for UnixDatagram
source
impl From<OwnedFd> for UnixDatagram
sourceimpl From<UnixDatagram> for OwnedFd
source
impl From<UnixDatagram> for OwnedFd
sourcefn from(unix_datagram: UnixDatagram) -> OwnedFd
source
fn from(unix_datagram: UnixDatagram) -> OwnedFd
sourceConverts to this type from the input type.
impl FromRawFd for UnixDatagram
source
impl FromRawFd for UnixDatagram
sourceunsafe fn from_raw_fd(fd: RawFd) -> UnixDatagram
source
unsafe fn from_raw_fd(fd: RawFd) -> UnixDatagram
sourceConstructs a new instance of Self from the given raw file
descriptor. Read more
impl IntoRawFd for UnixDatagram
source
impl IntoRawFd for UnixDatagram
sourcefn into_raw_fd(self) -> RawFd
source
fn into_raw_fd(self) -> RawFd
sourceConsumes this object, returning the raw underlying file descriptor. Read more
Auto Trait Implementations
impl RefUnwindSafe for UnixDatagram
impl Send for UnixDatagram
impl Sync for UnixDatagram
impl Unpin for UnixDatagram
impl UnwindSafe for UnixDatagram
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
source
impl<T> BorrowMut<T> for T where
T: ?Sized,
sourcefn borrow_mut(&mut self) -> &mut T
const: unstable · source
fn borrow_mut(&mut self) -> &mut T
const: unstable · sourceMutably borrows from an owned value. Read more