Crates.io | dgrambuf |
lib.rs | dgrambuf |
version | 0.2.0 |
source | src |
created_at | 2022-04-22 13:27:27.969394 |
updated_at | 2023-01-13 17:16:04.500187 |
description | A fixed capacity ring buffer for datagrams (byte slices) |
homepage | https://sr.ht/~jpastuszek/dgrambuf/ |
repository | https://git.sr.ht/~jpastuszek/dgrambuf |
max_upload_size | |
id | 572160 |
size | 19,464 |
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.
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(())
}