13个版本 (2个稳定版)

1.0.1 2021年12月8日
1.0.0 2021年4月26日
1.0.0-rc.22020年2月15日
0.5.1 2019年12月7日
0.0.0 2018年6月16日

#244 in 网络编程

Download history 548/week @ 2024-03-14 678/week @ 2024-03-21 518/week @ 2024-03-28 698/week @ 2024-04-04 688/week @ 2024-04-11 1520/week @ 2024-04-18 1356/week @ 2024-04-25 1118/week @ 2024-05-02 1693/week @ 2024-05-09 838/week @ 2024-05-16 881/week @ 2024-05-23 918/week @ 2024-05-30 797/week @ 2024-06-06 769/week @ 2024-06-13 696/week @ 2024-06-20 651/week @ 2024-06-27

每月3,063次下载
用于11个crate9个直接使用)

MIT许可证

180KB
2.5K SLoC

NNG的安全Rust封装

docs.rs crates.io MIT License Rustc 1.36+ Pipeline

什么是NNG

来自NNG Github仓库

NNG,就像它的前辈nanomsg(以及在某种程度上ZeroMQ)一样,是一个轻量级的无代理库,提供简单的API来解决常见的重复性消息问题,如发布/订阅、RPC风格请求/响应或服务发现。该API使程序员从关注连接管理、重试和其他常见问题中解放出来,从而可以专注于应用程序而不是管道。

Nng-rs

这个crate提供了对NNG库的安全封装,力求保持与原始库类似的API。因此,大多数在线可用的示例都应该很容易应用到这个crate上。

Rust版本要求

当前版本需要Rustc v1.36或更高版本。通常,这个crate应该始终能够在最旧的当前支持的Ubuntu LTS版本上的Rustc版本编译。只有当新要求的版本在最早的当前支持的Ubuntu LTS版本上不可用时,更改最小所需的Rustc版本才会被视为破坏性更改。

注意:这并不一定意味着这个crate可以在Ubuntu LTS上构建而无需安装任何包,因为NNG当前需要一个比LTS存储库中可用的版本更新的CMake(v3.13)版本。

功能

  • build-nng(默认):从源代码构建NNG并将其静态链接到库。
  • ffi-module:通过nng::ffi模块公开原始FFI绑定。这对于利用NNG在基础库中实现但在此封装中未实现的特性很有用。请注意,这暴露了此库的一些内部项,并直接暴露了NNG库,因此启用此功能的内容可能会更改而无需版本升级。

构建NNG

启用build-nng功能将导致使用默认设置和CMake生成器构建NNG库。大多数情况下,这应该会正常工作。但是,如果默认设置不是所需的设置,有三种方法可以更改构建

  1. 修复 nng-sys 依赖项并启用所需的构建功能。
  2. 禁用 build-nng 功能并直接依赖 nng-sys
  3. 禁用 build-nng 功能并手动编译 NNG。

由于 Cargo 功能目前是 严格累加的,且无法指定互斥功能(即构建设置),因此在此 crate 中没有暴露构建功能。此外,这个 crate 暴露与绑定 crate 相同的所有构建功能似乎不太方便,可能会导致依赖 crate 中的功能污染。

欢迎提出更好的解决方案。

示例

以下示例使用 进程内 传输来设置一个 请求/回复 套接字对。客户端向服务器发送一个字符串,服务器以一句漂亮的话语进行回复。

use nng::*;

const ADDRESS: &'static str = "inproc://nng/example";

fn request() -> Result<()> {
    // Set up the client and connect to the specified address
    let client = Socket::new(Protocol::Req0)?;
    client.dial(ADDRESS)?;

    // Send the request from the client to the server. In general, it will be
    // better to directly use a `Message` to enable zero-copy, but that doesn't
    // matter here.
    client.send("Ferris".as_bytes())?;

    // Wait for the response from the server.
    let msg = client.recv()?;
    assert_eq!(&msg[..], b"Hello, Ferris");
    Ok(())
}

fn reply() -> Result<()> {
    // Set up the server and listen for connections on the specified address.
    let server = Socket::new(Protocol::Rep0)?;
    server.listen(ADDRESS)?;

    // Receive the message from the client.
    let mut msg = server.recv()?;
    assert_eq!(&msg[..], b"Ferris");

    // Reuse the message to be more efficient.
    msg.push_front(b"Hello, ");

    server.send(msg)?;
    Ok(())
}

更多示例在 examples 目录中。

依赖项

~3MB
~87K SLoC