Struct UdpSocket
struct UdpSocket { ... }
A User Datagram Protocol socket.
This is an implementation of a bound UDP socket. This supports both IPv4 and IPv6 addresses, and there is no corresponding notion of a server because UDP is a datagram protocol.
Examples
# use Error;
#
#
Implementations
impl UdpSocket
fn bind(addr: SocketAddr) -> Result<UdpSocket>Creates a UDP socket from the given address.
Examples
# use Error; # #fn from_std(socket: UdpSocket) -> UdpSocketCreates a new
UdpSocketfrom a standardnet::UdpSocket.This function is intended to be used to wrap a UDP socket from the standard library in the Mio equivalent. The conversion assumes nothing about the underlying socket; it is left up to the user to set it in non-blocking mode.
fn local_addr(self: &Self) -> Result<SocketAddr>Returns the socket address that this socket was created from.
Examples
# use Error; # #fn peer_addr(self: &Self) -> Result<SocketAddr>Returns the socket address of the remote peer this socket was connected to.
Examples
# use Error; # #fn send_to(self: &Self, buf: &[u8], target: SocketAddr) -> Result<usize>Sends data on the socket to the given address. On success, returns the number of bytes written.
Address type can be any implementor of
ToSocketAddrstrait. See its documentation for concrete examples.Examples
# use std::error::Error; # fn main() -> Result<(), Box<dyn Error>> { use mio::net::UdpSocket; let socket = UdpSocket::bind("127.0.0.1:0".parse()?)?; // We must check if the socket is writable before calling send_to, // or we could run into a WouldBlock error. let bytes_sent = socket.send_to(&[9; 9], "127.0.0.1:11100".parse()?)?; assert_eq!(bytes_sent, 9); # # Ok(()) # }fn recv_from(self: &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.
Notes
On Windows, if the data is larger than the buffer specified, the buffer is filled with the first part of the data, and recv_from returns the error WSAEMSGSIZE(10040). The excess data is lost. Make sure to always use a sufficiently large buffer to hold the maximum UDP packet size, which can be up to 65536 bytes in size.
Examples
# use std::error::Error; # # fn main() -> Result<(), Box<dyn Error>> { use mio::net::UdpSocket; let socket = UdpSocket::bind("127.0.0.1:0".parse()?)?; // We must check if the socket is readable before calling recv_from, // or we could run into a WouldBlock error. let mut buf = [0; 9]; let (num_recv, from_addr) = socket.recv_from(&mut buf)?; println!("Received {:?} -> {:?} bytes from {:?}", buf, num_recv, from_addr); # # Ok(()) # }fn peek_from(self: &Self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>Receives data from the socket, without removing it from the input queue. On success, returns the number of bytes read and the address from whence the data came.
Notes
On Windows, if the data is larger than the buffer specified, the buffer is filled with the first part of the data, and peek_from returns the error WSAEMSGSIZE(10040). The excess data is lost. Make sure to always use a sufficiently large buffer to hold the maximum UDP packet size, which can be up to 65536 bytes in size.
Examples
# use std::error::Error; # # fn main() -> Result<(), Box<dyn Error>> { use mio::net::UdpSocket; let socket = UdpSocket::bind("127.0.0.1:0".parse()?)?; // We must check if the socket is readable before calling recv_from, // or we could run into a WouldBlock error. let mut buf = [0; 9]; let (num_recv, from_addr) = socket.peek_from(&mut buf)?; println!("Received {:?} -> {:?} bytes from {:?}", buf, num_recv, from_addr); # # Ok(()) # }fn send(self: &Self, buf: &[u8]) -> Result<usize>Sends data on the socket to the address previously bound via connect(). On success, returns the number of bytes written.
fn recv(self: &Self, buf: &mut [u8]) -> Result<usize>Receives data from the socket previously bound with connect(). On success, returns the number of bytes read.
Notes
On Windows, if the data is larger than the buffer specified, the buffer is filled with the first part of the data, and recv returns the error WSAEMSGSIZE(10040). The excess data is lost. Make sure to always use a sufficiently large buffer to hold the maximum UDP packet size, which can be up to 65536 bytes in size.
fn peek(self: &Self, buf: &mut [u8]) -> Result<usize>Receives data from the socket, without removing it from the input queue. On success, returns the number of bytes read.
Notes
On Windows, if the data is larger than the buffer specified, the buffer is filled with the first part of the data, and peek returns the error WSAEMSGSIZE(10040). The excess data is lost. Make sure to always use a sufficiently large buffer to hold the maximum UDP packet size, which can be up to 65536 bytes in size.
fn connect(self: &Self, addr: SocketAddr) -> Result<()>Connects the UDP socket setting the default destination for
send()and limiting packets that are read viarecvfrom the address specified inaddr.This may return a
WouldBlockin which case the socket connection cannot be completed immediately, it usually means there are insufficient entries in the routing cache.fn set_broadcast(self: &Self, on: bool) -> Result<()>Sets the value of the
SO_BROADCASToption for this socket.When enabled, this socket is allowed to send packets to a broadcast address.
Examples
# use Error; # #fn broadcast(self: &Self) -> Result<bool>Gets the value of the
SO_BROADCASToption for this socket.For more information about this option, see
set_broadcast.Examples
# use Error; # #fn set_multicast_loop_v4(self: &Self, on: bool) -> Result<()>Sets the value of the
IP_MULTICAST_LOOPoption for this socket.If enabled, multicast packets will be looped back to the local socket. Note that this may not have any affect on IPv6 sockets.
fn multicast_loop_v4(self: &Self) -> Result<bool>Gets the value of the
IP_MULTICAST_LOOPoption for this socket.For more information about this option, see
set_multicast_loop_v4.fn set_multicast_ttl_v4(self: &Self, ttl: u32) -> Result<()>Sets the value of the
IP_MULTICAST_TTLoption for this socket.Indicates the time-to-live value of outgoing multicast packets for this socket. The default value is 1 which means that multicast packets don't leave the local network unless explicitly requested.
Note that this may not have any affect on IPv6 sockets.
fn multicast_ttl_v4(self: &Self) -> Result<u32>Gets the value of the
IP_MULTICAST_TTLoption for this socket.For more information about this option, see
set_multicast_ttl_v4.fn set_multicast_loop_v6(self: &Self, on: bool) -> Result<()>Sets the value of the
IPV6_MULTICAST_LOOPoption for this socket.Controls whether this socket sees the multicast packets it sends itself. Note that this may not have any affect on IPv4 sockets.
fn multicast_loop_v6(self: &Self) -> Result<bool>Gets the value of the
IPV6_MULTICAST_LOOPoption for this socket.For more information about this option, see
set_multicast_loop_v6.fn set_ttl(self: &Self, ttl: u32) -> Result<()>Sets the value for the
IP_TTLoption on this socket.This value sets the time-to-live field that is used in every packet sent from this socket.
Examples
# use Error; # #fn ttl(self: &Self) -> Result<u32>Gets the value of the
IP_TTLoption for this socket.For more information about this option, see
set_ttl.Examples
# use Error; # #fn join_multicast_v4(self: &Self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> Result<()>Executes an operation of the
IP_ADD_MEMBERSHIPtype.This function specifies a new multicast group for this socket to join. The address must be a valid multicast address, and
interfaceis the address of the local interface with which the system should join the multicast group. If it's equal toINADDR_ANYthen an appropriate interface is chosen by the system.fn join_multicast_v6(self: &Self, multiaddr: &Ipv6Addr, interface: u32) -> Result<()>Executes an operation of the
IPV6_ADD_MEMBERSHIPtype.This function specifies a new multicast group for this socket to join. The address must be a valid multicast address, and
interfaceis the index of the interface to join/leave (or 0 to indicate any interface).fn leave_multicast_v4(self: &Self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> Result<()>Executes an operation of the
IP_DROP_MEMBERSHIPtype.For more information about this option, see
join_multicast_v4.fn leave_multicast_v6(self: &Self, multiaddr: &Ipv6Addr, interface: u32) -> Result<()>Executes an operation of the
IPV6_DROP_MEMBERSHIPtype.For more information about this option, see
join_multicast_v6.fn only_v6(self: &Self) -> Result<bool>Get the value of the
IPV6_V6ONLYoption on this socket.fn take_error(self: &Self) -> Result<Option<Error>>Get the value of the
SO_ERRORoption on this socket.This will retrieve the stored error in the underlying socket, clearing the field in the process. This can be useful for checking errors between calls.
fn try_io<F, T>(self: &Self, f: F) -> Result<T> where F: FnOnce() -> Result<T>Execute an I/O operation ensuring that the socket receives more events if it hits a
WouldBlockerror.Notes
This method is required to be called for all I/O operations to ensure the user will receive events once the socket is ready again after returning a
WouldBlockerror.Examples
# use std::error::Error; # # fn main() -> Result<(), Box<dyn Error>> { use std::io; #[cfg(any(unix, target_os = "wasi"))] use std::os::fd::AsRawFd; #[cfg(windows)] use std::os::windows::io::AsRawSocket; use mio::net::UdpSocket; let address = "127.0.0.1:8080".parse().unwrap(); let dgram = UdpSocket::bind(address)?; // Wait until the dgram is readable... // Read from the dgram using a direct libc call, of course the // `io::Read` implementation would be easier to use. let mut buf = [0; 512]; let n = dgram.try_io(|| { let buf_ptr = &mut buf as *mut _ as *mut _; #[cfg(unix)] let res = unsafe { libc::recv(dgram.as_raw_fd(), buf_ptr, buf.len(), 0) }; #[cfg(windows)] let res = unsafe { libc::recvfrom(dgram.as_raw_socket() as usize, buf_ptr, buf.len() as i32, 0, std::ptr::null_mut(), std::ptr::null_mut()) }; if res != -1 { Ok(res as usize) } else { // If EAGAIN or EWOULDBLOCK is set by libc::recv, the closure // should return `WouldBlock` error. Err(io::Error::last_os_error()) } })?; eprintln!("read {} bytes", n); # Ok(()) # }
impl AsFd for UdpSocket
fn as_fd(self: &Self) -> BorrowedFd<'_>
impl AsRawFd for UdpSocket
fn as_raw_fd(self: &Self) -> RawFd
impl Debug for UdpSocket
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Freeze for UdpSocket
impl From for UdpSocket
fn from(fd: OwnedFd) -> SelfConverts a
RawFdto aUdpSocket.Notes
The caller is responsible for ensuring that the socket is in non-blocking mode.
impl FromRawFd for UdpSocket
unsafe fn from_raw_fd(fd: RawFd) -> UdpSocketConverts a
RawFdto aUdpSocket.Notes
The caller is responsible for ensuring that the socket is in non-blocking mode.
impl IntoRawFd for UdpSocket
fn into_raw_fd(self: Self) -> RawFd
impl RefUnwindSafe for UdpSocket
impl Send for UdpSocket
impl Source for UdpSocket
fn register(self: &mut Self, registry: &Registry, token: Token, interests: Interest) -> Result<()>fn reregister(self: &mut Self, registry: &Registry, token: Token, interests: Interest) -> Result<()>fn deregister(self: &mut Self, registry: &Registry) -> Result<()>
impl Sync for UdpSocket
impl Unpin for UdpSocket
impl UnsafeUnpin for UdpSocket
impl UnwindSafe for UdpSocket
impl<T> Any for UdpSocket
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for UdpSocket
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for UdpSocket
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for UdpSocket
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for UdpSocket
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for UdpSocket
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for UdpSocket
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>