dfir_rs/util/
udp.rs
1#![cfg(not(target_arch = "wasm32"))]
2
3use std::net::SocketAddr;
4
5use bytes::Bytes;
6use futures::stream::{SplitSink, SplitStream};
7use tokio::net::UdpSocket;
8use tokio_util::codec::length_delimited::LengthDelimitedCodec;
9use tokio_util::codec::{BytesCodec, Decoder, Encoder, LinesCodec};
10use tokio_util::udp::UdpFramed;
11
12pub type UdpFramedSink<Codec, Item> = SplitSink<UdpFramed<Codec>, (Item, SocketAddr)>;
14pub type UdpFramedStream<Codec> = SplitStream<UdpFramed<Codec>>;
16pub fn udp_framed<Codec, Item>(
19 socket: UdpSocket,
20 codec: Codec,
21) -> (
22 UdpFramedSink<Codec, Item>,
23 UdpFramedStream<Codec>,
24 SocketAddr,
25)
26where
27 Codec: Encoder<Item> + Decoder,
28{
29 let framed = UdpFramed::new(socket, codec);
30 let addr = framed.get_ref().local_addr().unwrap();
31 let split = futures::stream::StreamExt::split(framed);
32 (split.0, split.1, addr)
33}
34
35pub type UdpSink = UdpFramedSink<LengthDelimitedCodec, Bytes>;
37pub type UdpStream = UdpFramedStream<LengthDelimitedCodec>;
39pub fn udp_bytes(socket: UdpSocket) -> (UdpSink, UdpStream, SocketAddr) {
42 udp_framed(socket, LengthDelimitedCodec::new())
43}
44
45pub type UdpBytesSink = UdpFramedSink<BytesCodec, Bytes>;
47pub type UdpBytesStream = UdpFramedStream<BytesCodec>;
49pub fn udp_bytestream(socket: UdpSocket) -> (UdpBytesSink, UdpBytesStream, SocketAddr) {
51 udp_framed(socket, BytesCodec::new())
52}
53
54pub type UdpLinesSink = UdpFramedSink<LinesCodec, String>;
56pub type UdpLinesStream = UdpFramedStream<LinesCodec>;
58pub fn udp_lines(
60 socket: UdpSocket,
61) -> (
62 UdpFramedSink<LinesCodec, String>,
63 UdpFramedStream<LinesCodec>,
64 SocketAddr,
65) {
66 udp_framed(socket, LinesCodec::new())
67}