14个不稳定版本 (4个重大变更)
0.4.2 | 2023年12月31日 |
---|---|
0.4.1 | 2023年8月20日 |
0.3.0 | 2023年8月14日 |
0.2.6 | 2021年4月2日 |
0.0.0 | 2019年11月23日 |
#29 in Unix APIs
每月324,059次下载
用于25个crate (4直接使用)
190KB
2.5K SLoC
uds
一个支持抽象地址、fd传递、SOCK_SEQPACKET套接字等的Unix域套接字Rust库。
尽可能通过扩展特性为std::os::unix::net
类型实现功能(以及可选的mio的uds类型),而不是暴露新的结构体。该crate暴露的唯一新套接字结构体是seqpacket套接字。
尚不支持辅助凭证和时间戳。
示例
(仅在Linux上成功运行)
extern crate uds;
let addr = uds::UnixSocketAddr::from_abstract(b"not a file!")
.expect("create abstract socket address");
let listener = uds::UnixSeqpacketListener::bind_unix_addr(&addr)
.expect("create seqpacket listener");
let client = uds::UnixSeqpacketConn::connect_unix_addr(&addr)
.expect("connect to listener");
client.send_fds(b"Here I come", &[0, 1, 2])
.expect("send stdin, stdout and stderr");
let (server_side, _) = listener.accept_unix_addr()
.expect("accept connection");
let creds: uds::ConnCredentials = server_side.initial_peer_credentials()
.expect("get peer credentials");
if creds.euid() == 0 {
let mut fd_buf = [-1; 3];
let (_, _, fds) = server_side.recv_fds(&mut[0u8; 1], &mut fd_buf
).expect("receive with fd capacity");
if fds == 3 {
/* do something with the file descriptors */
}
/* remember to close the file descripts */
} else {
server_side.send(b"go away!\n").expect("send response");
}
可移植性
macOS不支持SOCK_SEQPACKET套接字,抽象套接字地址仅限于Linux,因此如果您不想烦恼于支持不可移植的功能,您可能最好只使用std或mio提供的功能。如果您正在编写数据报服务器,则使用std或mio意味着您无法响应抽象地址,这迫使用户使用路径地址并自行清理套接字文件。
即使您关心的所有操作系统都支持某种功能,它们的操作可能也不同
在Linux上,当文件描述符被发送时,会进行克隆,但macOS和BSDs在接收时才会进行克隆。这意味着如果FD在对端接收之前被关闭,您会遇到问题。
此外,一些操作系统在接收时可能不会克隆原始文件描述符,如果它是从同一进程中发送的。 (DragonFly BSD,可能macOS和FreeBSD)。
Linux | macOS | FreeBSD | OpenBSD | DragonFly BSD | NetBSD | Illumos | |
---|---|---|---|---|---|---|---|
Seqpacket | 是 | N/A | 是 | 是 | 是 | 是 | N/A |
fd传递 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
抽象地址 | 是 | N/A | N/A | N/A | N/A | N/A | N/A |
mio 0.8 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
tokio 1.0 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
测试了吗? | 本地 + CI | CI | CI | CI | 手动* | 手动* | 手动* |
*:自v0.2.6以来未进行测试。(但在CI上进行了(交叉)检查。)
其他操作系统
- Android:我还没有在它上面测试,但假设它与常规Linux没有区别。
- Windows 10:虽然它添加了一些Unix套接字功能,但Windows支持不是优先项。(不过欢迎提交PR。)
- Solaris:与Illumos处理方式相同。mio 0.8不支持它。
mio集成
mio_08
特性使得seqpacket类型可以在mio版本0.8中使用(通过为它们实现其Source
特质),并为mio::net
中的Unix套接字类型实现了这个crate扩展特质。
要启用它,请将以下内容添加到Cargo.toml
[dependencies]
uds = {version="0.4.0", features=["mio_08"]}
tokio集成
tokio
特性添加了async
基于的seqpacket类型,用于与tokio版本1.*一起使用。
要启用它,请将以下内容添加到Cargo.toml
[dependencies]
uds = {version="0.4.2", features=["tokio"]}
最低Rust版本
最低Rust版本是1.63。
较旧版本可能可以使用,但可能在次版本更新中出现问题。
unsafe
使用
此crate调用许多C函数,这些函数都是unsafe
(甚至像socket()
这样简单的函数)。公共接口是安全的(除了FromRawFd
),所以如果您发现任何不安全的地方(即使是没有标记为unsafe
的内部函数),请提交一个issue。
许可证
许可协议为以下之一
- Apache许可证,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意提交到作品中的贡献,都将如上所述双重许可,没有额外的条款或条件。
依赖项
~0–11MB
~63K SLoC