12个版本 (5个不稳定)
1.4.0-rc.0 | 2021年4月26日 |
---|---|
1.3.1-rc.1 | 2020年8月9日 |
1.3.0-rc.1 | 2020年3月5日 |
1.1.1-rc.2 | 2019年10月7日 |
0.0.0 | 2018年6月16日 |
#3 in #nng
3,042 每月下载量
在 12 个crate中(通过 nng)使用
3MB
85K SLoC
Rust FFI绑定到 NNG
NNG,如同其前辈nanomsg(以及在某种程度上ZeroMQ),是一个轻量级的无代理库,提供简单的API来解决常见的重复性问题,例如发布/订阅、RPC风格的请求/回复或服务发现。API让程序员无需担心连接管理、重试和其他常见问题,从而可以将精力集中在应用程序而不是管道上。
用法
此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绑定到Ccmake-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
:启用TLSNNG_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);
}
}