Exposes the UDP-Lite socket type with an API similar to
UDP-Lite is a layer 3 networking protocol very similar to UDP, that allows receiving partially corrupted packets.
In addition to not being reliable (ie. datagrams can disappear), UDP-Lite is only useful if the layer 2 protocol supports disabling checksums, and is not all that usable on the wider internet. (My ISPs router doesn't recognize the protocol, so its NAT drops all packets.) The protocol is also only implemented on Linux and FreeBSD. (It looks like Android hasn't disabled it, but I'm not certain).
This crate is tested on both Linux (except Android) and FreeBSD.
use udplite::UdpLiteSocket; use std::net::*; let a = UdpLiteSocket::bind((Ipv4Addr::LOCALHOST, 0)) .expect("create UDP-Lite socket bound to 127.0.0.1:0"); let b = UdpLiteSocket::bind((Ipv4Addr::LOCALHOST, 0)) .expect("create another socket bound to 127.0.0.1:0"); // reduce sent and required checksum coverage (whole datagram by default) a.set_send_checksum_coverage(Some(5)).expect("set partial checksum coverage"); b.set_recv_checksum_coverage_filter(Some(5)).expect("set required checksum coverage"); let b_addr = b.local_addr().expect("get addr of socket b"); a.send_to(b"Hello UDP-Lite", b_addr).expect("send datagram"); let mut buf = [0u8; 20]; let received_bytes = b.recv(&mut buf).expect("receive datagram"); assert_eq!(received_bytes, "Hello UDP-Lite".len()); assert_eq!(&buf[..5], b"Hello");
To significantly reduce the amount of
unsafe code necessary in this crate,
most methods are provided through
This creates one wart/gotcha/unsoundness though:
.try_clone() is available, returning an
UdpSocket that is
actually UDP-Lite. The method is shadowed by
udplite will require Rust 1.36.0 (for
- Optional tokio integration.
- Vectored I/O (
UdpSocketdoesn't have this yet either).
- Exposing more POSIX socket options and flags for
- Sending and receiving multiple datagrams at a time.
- Getting TTL and/or timestamp of received datagrams.