#zeromq #nng #nanomsg #next-generation #service-discovery

sys no-std runng-sys

NNG (Nanomsg-Next-Generation) 即 Nanomsg2 的绑定

15 个版本 (2 个稳定版)

1.2.4-rc.12020 年 1 月 14 日
1.1.2-ver.2 2018 年 12 月 5 日
1.1.2-rc.12019 年 10 月 28 日
1.1.1 2018 年 11 月 28 日
0.1.4 2018 年 11 月 8 日

#5 in #nng

Download history 58/week @ 2024-03-12 28/week @ 2024-03-19 36/week @ 2024-03-26 125/week @ 2024-04-02 4/week @ 2024-04-09 108/week @ 2024-04-16 231/week @ 2024-04-23 180/week @ 2024-04-30 121/week @ 2024-05-07 11/week @ 2024-05-14 31/week @ 2024-05-21 36/week @ 2024-05-28 97/week @ 2024-06-04 49/week @ 2024-06-11 33/week @ 2024-06-18 65/week @ 2024-06-25

每月 257 次下载
用于 3 个 crate(2 个直接使用)

MIT 许可证

2.5MB
75K SLoC

C 56K SLoC // 0.1% comments AsciiDoc 16K SLoC // 0.1% comments Rust 2.5K SLoC // 0.0% comments Shell 648 SLoC // 0.2% comments C++ 62 SLoC // 0.1% comments PowerShell 50 SLoC // 0.2% comments

Rust FFI 绑定到 NNG

NNG,像其前身 nanomsg(以及在一定程度上 ZeroMQ)一样,是一个轻量级、无代理库,提供了一个简单的 API 来解决常见的消息传递问题,如发布/订阅、RPC 风格的请求/回复或服务发现。该 API 解除了程序员对连接管理、重试等常见考虑的担忧,使他们能够专注于应用程序而不是管道。

docs.rs crates.io MIT License Rustc 1.31+ travis Build Status

用法

此 crate 的版本跟踪 NNG:<NNG_version>-rc.<crate_version>(例如 1.1.1-rc.2)。

要在 Cargo.toml 中使用最新的 crate,用于最新的 NNG 稳定版(1.2.x)

[dependencies]
nng-sys = "1.2.4-rc"

要求

  • cmakePATH
    • 在 Linux/macOS 上:默认生成器是 "Unix Makefiles"
    • 在 Windows 上:默认生成器通常是安装的最新版本的 Visual Studio
  • 可选 如果使用 build-bindgen 功能,则需要 libclang

特性

  • build-nng:使用 cmake 从源代码构建 NNG(默认启用)
  • build-bindgen:运行 bindgen 重新生成 Rust FFI 绑定到 C
  • cmake-unix:使用 cmake 生成器 "Unix Makefiles"(Linux/macOS 上的默认值)
  • cmake-ninja:使用 cmake 生成器 "Ninja"
  • cmake-vs2017:使用 cmake 生成器 "Visual Studio 15 2017"
  • cmake-vs2019:使用 cmake 生成器 "Visual Studio 16 2019"
  • nng-stats:启用 NNG 统计 NNG_ENABLE_STATS(默认启用)
  • nng-tls:启用 TLS NNG_ENABLE_TLS(需要 mbedTLS)
  • nng-supplemental:生成 NNG 补充功能的绑定
  • nng-compat:生成 NNG 与 nanomsg 兼容功能的绑定

示例)使用 bindgen 重新生成 FFI 绑定

[dependencies]
nng-sys = { version = "1.2.4-rc", features = ["build-bindgen"] }

示例)禁用统计并使用 Ninja cmake 生成器

[dependencies.nng-sys]
version = "1.2.4-rc"
default-features = false
features = ["cmake-ninja"]

示例

use nng_sys::*;
use std::{ffi::CString, os::raw::c_char, ptr::null_mut};

fn example() {
    unsafe {
        let url = CString::new("inproc://nng_sys/tests/example").unwrap();
        let url = url.as_bytes_with_nul().as_ptr() as *const c_char;

        // Reply socket
        let mut rep_socket = nng_socket::default();
        nng_rep0_open(&mut rep_socket);
        nng_listen(rep_socket, url, null_mut(), 0);

        // Request socket
        let mut req_socket = nng_socket::default();
        nng_req0_open(&mut req_socket);
        nng_dial(req_socket, url, null_mut(), 0);

        // Send message
        let mut req_msg: *mut nng_msg = null_mut();
        nng_msg_alloc(&mut req_msg, 0);
        // Add a value to the body of the message
        let val = 0x12345678;
        nng_msg_append_u32(req_msg, val);
        nng_sendmsg(req_socket, req_msg, 0);

        // Receive it
        let mut recv_msg: *mut nng_msg = null_mut();
        nng_recvmsg(rep_socket, &mut recv_msg, 0);
        // Remove our value from the body of the received message
        let mut recv_val: u32 = 0;
        nng_msg_trim_u32(recv_msg, &mut recv_val);
        assert_eq!(val, recv_val);
        // Can't do this because nng uses network order (big-endian)
        //assert_eq!(val, *(nng_msg_body(recv_msg) as *const u32));

        nng_close(req_socket);
        nng_close(rep_socket);
    }
}

依赖项