#[non_exhaustive]
pub enum ControlMessageOwned {
ScmRights(Vec<RawFd>),
ScmTimestamp(TimeVal),
Ipv4PacketInfo(in_pktinfo),
Ipv6PacketInfo(in6_pktinfo),
Ipv4RecvIf(sockaddr_dl),
Ipv4RecvDstAddr(in_addr),
// some variants omitted
}
Available on crate features
socket
and uio
only.Expand description
A type-safe wrapper around a single control message, as used with
recvmsg
.
Variants (Non-exhaustive)
This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
ScmRights(Vec<RawFd>)
Received version of ControlMessage::ScmRights
ScmTimestamp(TimeVal)
A message of type SCM_TIMESTAMP
, containing the time the
packet was received by the kernel.
See the kernel’s explanation in “SO_TIMESTAMP” of networking/timestamping.
Examples
// Set up
let message = "Ohayō!".as_bytes();
let in_socket = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
None).unwrap();
setsockopt(in_socket, sockopt::ReceiveTimestamp, &true).unwrap();
let localhost = SockaddrIn::from_str("127.0.0.1:0").unwrap();
bind(in_socket, &localhost).unwrap();
let address: SockaddrIn = getsockname(in_socket).unwrap();
// Get initial time
let time0 = SystemTime::now();
// Send the message
let iov = [IoSlice::new(message)];
let flags = MsgFlags::empty();
let l = sendmsg(in_socket, &iov, &[], flags, Some(&address)).unwrap();
assert_eq!(message.len(), l);
// Receive the message
let mut buffer = vec![0u8; message.len()];
let mut cmsgspace = cmsg_space!(TimeVal);
let mut iov = [IoSliceMut::new(&mut buffer)];
let r = recvmsg::<SockaddrIn>(in_socket, &mut iov, Some(&mut cmsgspace), flags)
.unwrap();
let rtime = match r.cmsgs().next() {
Some(ControlMessageOwned::ScmTimestamp(rtime)) => rtime,
Some(_) => panic!("Unexpected control message"),
None => panic!("No control message")
};
// Check the final time
let time1 = SystemTime::now();
// the packet's received timestamp should lie in-between the two system
// times, unless the system clock was adjusted in the meantime.
let rduration = Duration::new(rtime.tv_sec() as u64,
rtime.tv_usec() as u32 * 1000);
assert!(time0.duration_since(UNIX_EPOCH).unwrap() <= rduration);
assert!(rduration <= time1.duration_since(UNIX_EPOCH).unwrap());
// Close socket
nix::unistd::close(in_socket).unwrap();
Ipv4PacketInfo(in_pktinfo)
Available on crate feature
net
only.Ipv6PacketInfo(in6_pktinfo)
Available on crate feature
net
only.Ipv4RecvIf(sockaddr_dl)
Available on crate feature
net
only.Ipv4RecvDstAddr(in_addr)
Available on crate feature
net
only.Trait Implementations
sourceimpl Clone for ControlMessageOwned
impl Clone for ControlMessageOwned
sourcefn clone(&self) -> ControlMessageOwned
fn clone(&self) -> ControlMessageOwned
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl Debug for ControlMessageOwned
impl Debug for ControlMessageOwned
sourceimpl PartialEq<ControlMessageOwned> for ControlMessageOwned
impl PartialEq<ControlMessageOwned> for ControlMessageOwned
sourcefn eq(&self, other: &ControlMessageOwned) -> bool
fn eq(&self, other: &ControlMessageOwned) -> bool
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
sourcefn ne(&self, other: &ControlMessageOwned) -> bool
fn ne(&self, other: &ControlMessageOwned) -> bool
This method tests for !=
.
impl Eq for ControlMessageOwned
impl StructuralEq for ControlMessageOwned
impl StructuralPartialEq for ControlMessageOwned
Auto Trait Implementations
impl RefUnwindSafe for ControlMessageOwned
impl Send for ControlMessageOwned
impl Sync for ControlMessageOwned
impl Unpin for ControlMessageOwned
impl UnwindSafe for ControlMessageOwned
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more