13个版本 (2个稳定版)
1.0.1 | 2021年12月8日 |
---|---|
1.0.0 | 2021年4月26日 |
1.0.0-rc.2 | 2020年2月15日 |
0.5.1 | 2019年12月7日 |
0.0.0 | 2018年6月16日 |
#244 in 网络编程
每月3,063次下载
用于11个crate(9个直接使用)
180KB
2.5K SLoC
NNG的安全Rust封装
什么是NNG
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库。大多数情况下,这应该会正常工作。但是,如果默认设置不是所需的设置,有三种方法可以更改构建
- 修复
nng-sys
依赖项并启用所需的构建功能。 - 禁用
build-nng
功能并直接依赖nng-sys
。 - 禁用
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