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

sys no-std nng-sys

对NNG(Nanomsg-Next-Generation)的绑定,亦称Nanomsg2

12个版本 (5个不稳定)

1.4.0-rc.02021年4月26日
1.3.1-rc.12020年8月9日
1.3.0-rc.12020年3月5日
1.1.1-rc.22019年10月7日
0.0.0 2018年6月16日

#3 in #nng

Download history 583/week @ 2024-03-14 693/week @ 2024-03-21 523/week @ 2024-03-28 647/week @ 2024-04-04 704/week @ 2024-04-11 1525/week @ 2024-04-18 1370/week @ 2024-04-25 1125/week @ 2024-05-02 1705/week @ 2024-05-09 855/week @ 2024-05-16 898/week @ 2024-05-23 930/week @ 2024-05-30 793/week @ 2024-06-06 764/week @ 2024-06-13 685/week @ 2024-06-20 647/week @ 2024-06-27

3,042 每月下载量
12 个crate中(通过 nng)使用

MIT 许可证

3MB
85K SLoC

C 65K SLoC // 0.1% comments AsciiDoc 17K SLoC // 0.1% comments Rust 2.5K SLoC // 0.0% comments Go 427 SLoC // 0.0% comments Shell 321 SLoC // 0.3% comments PowerShell 66 SLoC // 0.2% comments C++ 62 SLoC // 0.1% 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)。

要使用最新的crate,即最新的稳定版NNG(1.4.x),在 Cargo.toml

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

需求

  • cmake v3.13或更高版本在 PATH
    • 在Linux/macOS上:默认生成器是"Unix Makefiles"
    • 在Windows上:默认生成器通常是安装的最新版Visual Studio
  • 可选 如果使用 build-bindgen 功能来运行 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纳米消息兼容函数的绑定

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

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

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

[dependencies.nng-sys]
version = "1.4.0-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);
    }
}

依赖项