#udp #tokio #async

tokio-udp-framed

基于 tokio-util 的 UdpFramed,但进行了一些改进以提高用户体验,以支持对 UdpSocket 的共享所有权,并将发送/接收拆分为它们自己的类型

1 个不稳定版本

0.1.0 2021 年 2 月 18 日

#153#udp

MIT 许可证

25KB
493

tokio-udp-framed

这个项目最初是从 tokio-util 的 UdpFramed 的副本开始的,进行了一些修改,提供了一种不同的 API

  • 所有 UdpFramed 类型都接受一个 Borrow<UdpSocket>,因此您可以传递一个 Arc<UdpSocket>&UdpSocket
  • 存在 UpdFramedRecvUdpFramedSend 类型,用于在 Sink/Stream 中专门进行 sendrecv
  • 由于 Borrow<UdpSocket>,您不能再使用 get_mut

主要好处可以通过一个示例轻松解释

let a_soc = Arc::new(UdpSocket::bind("127.0.0.1:0").await?);
let b_soc = a_soc.clone();

let a_addr = a_soc.local_addr()?;
let b_addr = b_soc.local_addr()?;

let mut a = UdpFramed::new(a_soc, ByteCodec);
let mut b = UdpFramed::new(b_soc, LinesCodec::new());

let msg = b"1\r\n2\r\n3\r\n".to_vec();
a.send((&msg, b_addr)).await?;

let msg = b"4\r\n5\r\n6\r\n".to_vec();
a.send((&msg, b_addr)).await?;

assert_eq!(b.next().await.unwrap().unwrap(), ("1".to_string(), a_addr));
assert_eq!(b.next().await.unwrap().unwrap(), ("2".to_string(), a_addr));
assert_eq!(b.next().await.unwrap().unwrap(), ("3".to_string(), a_addr));

assert_eq!(b.next().await.unwrap().unwrap(), ("4".to_string(), a_addr));
assert_eq!(b.next().await.unwrap().unwrap(), ("5".to_string(), a_addr));
assert_eq!(b.next().await.unwrap().unwrap(), ("6".to_string(), a_addr));

依赖关系

~2.7–4MB
~62K SLoC