2个不稳定版本

0.2.0 2023年10月20日
0.1.0 2023年10月19日

#5 in #socket-address

BSD-2-Clause OR MIT

22KB
412

tokio-unix-tcp

本crate将Unix和TCP监听器、套接字地址和流类型的tokio类型包装在每个泛型枚举中,同时存在帮助函数,通过两个变体传递。

在非Unix系统上,所有Unix特定行为都被编译为无操作。

类型

Listener

可以是 tokio::net::TcpListenertokio::net::UnixListener。此包装器允许绑定到路径或IP地址和端口。

绑定返回一个 Listener 实例,可用于等待新传入的连接并接受它们。

接受连接返回一个具有 local_addrpeer_addrSocket 实例。 local_peer 将是 Listener 绑定的 SocketAddr,而对于TCP套接字,peer_addr 将是远程IP地址和端口号;对于Unix套接字,将是一个无名的Unix套接字地址(UnixSocketAddr::AbstractOrUnnamed)。

使用 Listener::bind_and_prepare_unix 函数,在Unix套接字中使用时,删除绑定路径上的现有文件。此函数还允许调整套接字的模式(默认为 0o222)。

UnixSocketAddr

针对此crate目的,是 tokio::net::unix::SocketAddr 的更开发者友好的版本。目前Tokio不支持抽象Unix套接字,但底层的 mio::net::SocketAddr 支持抽象Unix套接字。

这会导致 tokio::net::unix::SocketAddr 处于一个尴尬的状态,此时调用 is_unnamed 可能返回 false,而 as_pathname 也返回 None。通过提供一个统一变体来表示未命名的或抽象套接字,UnixSocketAddr 解决了这个问题。

SocketAddr

可以是 std::net::SocketAddrUnixSocketAddr。此类型用作已建立流的本地或对等地址。

使用 to_named_socket_addr 转换为 NamedSocketAddr 时可能会抛出异常,如果 Unix 套接字是 UnixSocketAddr::AbstractOrUnnamed,它不能表示为 NamedSocketAddr。请参阅下面的文档。

NamedSocketAddr

可以是 std::net::SocketAddrstd::path::PathBuf。此类型用于创建套接字(连接)或创建监听器(绑定)。

此类型与 SocketAddr 不同,因为它没有 Unix 套接字的未命名变体。如果 Tokio 开始支持抽象 Unix 套接字,NamedSocketAddr::Unix 变体也将需要支持此功能,而不仅仅是 std::path::PathBuf

使用 to_socket_addr 转换为 SocketAddr 总是成功。

Stream

可以是 tokio::net::TcpStreamtokio::net::UnixStream。此包装器允许通过路径或 IP 地址和端口打开新的连接。

连接成功时,它返回一个同时具有 local_addrpeer_addrSocket 实例。对于 TCP 套接字,local_peer 将是本地 IP 地址和端口,而对于 Unix 套接字,将是一个未命名的 Unix 套接字地址(UnixSocketAddr::AbstractOrUnnamed)和 peer_addr 将是服务器的远程 SocketAddr(即 IP 地址和端口或路径)。

标志和编译目标

启用 serde 标志为 SocketAddrNamedSocketAddr 添加序列化和反序列化辅助工具。

在非 unix 系统上编译将排除所有 Unix 特定功能和方法。TCP 仍然可以完美工作。

  • multisock 用于统一 std::netstd::os::unix::net
  • async-uninet 用于统一来自 async_std 和来自 std 的异步类型

据我所知,这两个都不太擅长处理抽象和无名 Unix 套接字的细微差别,而这个创建的目标也是解决这个问题。

许可协议

此库采用 BSD 2-Clause "简化" 许可协议或 MIT 许可协议进行许可。

依赖项

~4–16MB
~150K SLoC