2 unstable releases
0.2.0 | Jan 13, 2023 |
---|---|
0.1.0 | Apr 22, 2022 |
#2050 in Data structures
Used in socktee
19KB
333 lines
A fixed size ring buffer for datagrams of various sizes.
Implementation uses std::collections::VecDeque
for metadata storage and a fixed size backing buffer for storage of datagram data.
Examples
Usage as store and forward buffer for UNIX datagram socket.
use dgrambuf::DatagramBuf;
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::bind("/path/to/my/socket")?;
// allocate backing buffer
let mut dgram_buf = Vec::new();
dgram_buf.resize(512, 0);
let mut dgram_buf = DatagramBuf::from_slice(&mut dgram_buf);
// receive 10 datagrams up to 128 bytes in length each
for _ in 0..10 {
// drop old datagrams if there is not enough space left in the backing buffer (512)
let mut buf = dgram_buf.alloc_front_drop(128).unwrap();
let count = socket.recv(&mut buf)?;
// reduce the size of the allocation to fit the datagram received
dgram_buf.truncate_front(count);
}
// send back the received datagrams in order
while let Some(mut buf) = dgram_buf.pop_back() {
socket.send(&mut buf)?;
}
Ok(())
}