Skip to content

Instantly share code, notes, and snippets.

@rroohhh
Created July 5, 2022 12:58
Show Gist options
  • Save rroohhh/acb6247f7634e4e68d53604c4c3f88b1 to your computer and use it in GitHub Desktop.
Save rroohhh/acb6247f7634e4e68d53604c4c3f88b1 to your computer and use it in GitHub Desktop.
use nix::sys::socket::{
recvmmsg, sendmmsg, socket, AddressFamily, MsgFlags, MultHdrs, SockFlag, SockProtocol,
SockType, SockaddrIn,
};
use std::io::{IoSlice, IoSliceMut};
use std::str::FromStr;
fn main() {
let sock_addr = SockaddrIn::from_str("127.0.0.1:6790").unwrap();
let ssock = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
SockProtocol::Udp,
)
.unwrap();
let rsock = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
SockProtocol::Udp,
)
.unwrap();
nix::sys::socket::bind(rsock, &sock_addr).unwrap();
let sbufs = [[0xaau8; 1]; 1];
let flags = MsgFlags::empty();
sendmmsg(
ssock,
&mut MultHdrs::preallocate(1, None),
sbufs.iter().map(|buf| [IoSlice::new(buf)]),
vec![Some(sock_addr); 1],
&[],
flags,
)
.unwrap();
let mut rbuf = [[0x55u8; 1]; 1];
let mut hdrs = MultHdrs::preallocate(1, None);
let recvs = recvmmsg::<'_, _, (), _>(
rsock,
&mut hdrs,
rbuf.iter_mut().map(|buf| [IoSliceMut::new(buf)]),
flags,
None,
)
.unwrap();
for (recv, sbuf) in recvs.zip(sbufs) {
assert_eq!(recv.iovs().next().unwrap(), sbuf);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment