#nng #bindings #test #default #nanomsg #aka #cmake-ninja

构建 cargo_crates-io_docs-rs_test

绑定到nng(Nanomsg-Next-Generation)即Nanomsg2

10个版本 (4个重大更改)

0.5.0 2019年1月30日
0.4.0-rc.32019年1月4日
0.3.0 2019年1月4日
0.2.0+1 2019年1月4日
0.1.0-rc.12019年1月4日

#443构建实用工具

每月47次 下载
cargo_crates-io_docs-rs_t… 中使用

MIT 协议

2.5MB
67K SLoC

C 52K SLoC // 0.1% comments AsciiDoc 14K SLoC // 0.2% comments Shell 648 SLoC // 0.2% comments Rust 155 SLoC // 0.1% comments C++ 62 SLoC // 0.1% comments

runng-sys

Rust FFI绑定到NNG(使用bindgen生成)

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

使用方法

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

要使用最新crate的NNG最新稳定版本(1.1.1),在Cargo.toml

runng-sys = "1.1.1-rc"

要求

  • cmakePATH
    • 在Linux/macOS上:默认生成器是"Unix Makefiles",应该"正常工作"。
    • 在Windows上:默认生成器是ninja,并且也必须在 PATH 中。
  • libclang

要获得NNG的更直观的API,请参阅runng

特性

  • cmake-ninja:使用cmake生成器" Ninja"
  • cmake-vs2017:使用cmake生成器"Visual Studio 15 2017"
  • cmake-vs2017-win64:使用cmake生成器"Visual Studio 15 2017 Win64"
  • nng-stats:启用 NNG 统计信息 NNG_ENABLE_STATS(默认启用)
  • nng-tls:启用 TLS NNG_ENABLE_TLS(需要 mbedTLS,默认禁用)

例如,禁用统计信息并使用 Ninja cmake 生成器

[dependencies.runng-sys]
version = "1.1.1-rc"
default-features = false
features = ["cmake-ninja"]

示例

use runng_sys::*;
use std::{ffi::CString, ptr::null_mut};

#[test]
fn example() {
    unsafe {
        let url = CString::new("inproc://test").unwrap();
        let url = url.as_bytes_with_nul().as_ptr() as *const std::os::raw::c_char;

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

        // Request socket
        let mut req_socket = nng_socket { id: 0 };
        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);
    }
}

依赖项

~0–2.4MB
~46K SLoC