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::net
async-uninet
用于统一来自async_std
和来自std
的异步类型
据我所知,这两个都不太擅长处理抽象和无名 Unix 套接字的细微差别,而这个创建的目标也是解决这个问题。
许可协议
此库采用 BSD 2-Clause "简化" 许可协议或 MIT 许可协议进行许可。
依赖项
~4–16MB
~150K SLoC