Enum nix::sys::socket::ControlMessageOwned
source · #[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§
source§impl Clone for ControlMessageOwned
impl Clone for ControlMessageOwned
source§fn clone(&self) -> ControlMessageOwned
fn clone(&self) -> ControlMessageOwned
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moresource§impl Debug for ControlMessageOwned
impl Debug for ControlMessageOwned
source§impl PartialEq<ControlMessageOwned> for ControlMessageOwned
impl PartialEq<ControlMessageOwned> for ControlMessageOwned
source§fn 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 ==
.