2个不稳定版本
| 0.2.0 | 2023年10月20日 |
|---|---|
| 0.1.0 | 2023年10月19日 |
#5 in #socket-address
22KB
412 行
tokio-unix-tcp
本crate将Unix和TCP监听器、套接字地址和流类型的tokio类型包装在每个泛型枚举中,同时存在帮助函数,通过两个变体传递。
在非Unix系统上,所有Unix特定行为都被编译为无操作。
类型
Listener
可以是 tokio::net::TcpListener 或 tokio::net::UnixListener。此包装器允许绑定到路径或IP地址和端口。
绑定返回一个 Listener 实例,可用于等待新传入的连接并接受它们。
接受连接返回一个具有 local_addr 和 peer_addr 的 Socket 实例。 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::SocketAddr 或 UnixSocketAddr。此类型用作已建立流的本地或对等地址。
使用 to_named_socket_addr 转换为 NamedSocketAddr 时可能会抛出异常,如果 Unix 套接字是 UnixSocketAddr::AbstractOrUnnamed,它不能表示为 NamedSocketAddr。请参阅下面的文档。
NamedSocketAddr
可以是 std::net::SocketAddr 或 std::path::PathBuf。此类型用于创建套接字(连接)或创建监听器(绑定)。
此类型与 SocketAddr 不同,因为它没有 Unix 套接字的未命名变体。如果 Tokio 开始支持抽象 Unix 套接字,NamedSocketAddr::Unix 变体也将需要支持此功能,而不仅仅是 std::path::PathBuf。
使用 to_socket_addr 转换为 SocketAddr 总是成功。
Stream
可以是 tokio::net::TcpStream 或 tokio::net::UnixStream。此包装器允许通过路径或 IP 地址和端口打开新的连接。
连接成功时,它返回一个同时具有 local_addr 和 peer_addr 的 Socket 实例。对于 TCP 套接字,local_peer 将是本地 IP 地址和端口,而对于 Unix 套接字,将是一个未命名的 Unix 套接字地址(UnixSocketAddr::AbstractOrUnnamed)和 peer_addr 将是服务器的远程 SocketAddr(即 IP 地址和端口或路径)。
标志和编译目标
启用 serde 标志为 SocketAddr 和 NamedSocketAddr 添加序列化和反序列化辅助工具。
在非 unix 系统上编译将排除所有 Unix 特定功能和方法。TCP 仍然可以完美工作。
相关工作
multisock用于统一std::net和std::os::unix::netasync-uninet用于统一来自async_std和来自std的异步类型
据我所知,这两个都不太擅长处理抽象和无名 Unix 套接字的细微差别,而这个创建的目标也是解决这个问题。
许可协议
此库采用 BSD 2-Clause "简化" 许可协议或 MIT 许可协议进行许可。
依赖项
~4–16MB
~150K SLoC