#unix-socket #sockets #unix #抽象 #seqpacket

uds

支持抽象地址、fd传递和seqpacket套接字的Unix域套接字crate

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

Download history 66433/week @ 2024-04-23 62725/week @ 2024-04-30 65312/week @ 2024-05-07 59393/week @ 2024-05-14 62476/week @ 2024-05-21 74007/week @ 2024-05-28 61069/week @ 2024-06-04 60852/week @ 2024-06-11 60330/week @ 2024-06-18 69533/week @ 2024-06-25 56274/week @ 2024-07-02 77076/week @ 2024-07-09 72998/week @ 2024-07-16 88069/week @ 2024-07-23 68016/week @ 2024-07-30 80861/week @ 2024-08-06

每月324,059次下载
用于25个crate (4直接使用)

Apache-2.0 OR MIT

190KB
2.5K SLoC

uds

一个支持抽象地址、fd传递、SOCK_SEQPACKET套接字等的Unix域套接字Rust库。

crates.io page License: Apache v2 / MIT Documentation cirrus-ci build status sourcehut build status

尽可能通过扩展特性为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许可证定义,您提交的任何有意提交到作品中的贡献,都将如上所述双重许可,没有额外的条款或条件。

依赖项

~0–11MB
~63K SLoC