2个版本 (0个不稳定版本)
2.0.0-alpha1+1… | 2021年11月12日 |
---|---|
2.0.0-alpha1+1… | 2021年6月23日 |
#2 in #high-availability
每月下载 30次
165KB
5K SLoC
版权所有 (C) 2021 Red Hat, Inc. 保留所有权利。
作者:Christine Caulfield ccaulfie@redhat.com
本软件根据GPL-2.0+授权
此crate包含对kronosnet (knet) 库libknet的Rust绑定: https://kronosnet.org/
Kronosnet,通常称为knet,是一个为高可用性用例设计的网络抽象层,其中冗余、安全性、容错性和快速故障转移是应用程序的核心要求。
lib.rs
:
此crate提供从Rust访问kronosnet库 'libknet' 的功能。它们是围绕实际API调用的相对薄层,但使用Rust数据类型和迭代器。
此处将不再提供有关knet本身的信息,如果需要访问knet API调用,则预期您知道它们的功能 :)
示例
use knet_bindings::knet_bindings as knet;
use std::net::{SocketAddr, IpAddr, Ipv4Addr};
use std::thread::spawn;
use std::sync::mpsc::Receiver;
use std::sync::mpsc::channel;
use std::io::{Result, ErrorKind, Error};
use std::{thread, time};
const CHANNEL: i8 = 1;
pub fn main() -> Result<()>
{
let host_id = knet::HostId::new(1);
let other_host_id = knet::HostId::new(2);
let (log_sender, log_receiver) = channel::<knet::LogMsg>();
spawn(move || logging_thread(log_receiver));
let knet_handle = match knet::handle_new(&our_hostid, Some(log_sender),
knet::LogLevel::Debug, knet::HandleFlags::NONE) {
Ok(h) => h,
Err(e) => {
return Err(e);
}
};
if let Err(e) = knet::host_add(knet_handle, &other_hostid) {
return Err(e);
}
if let Err(e) = knet::link_set_config(knet_handle, &other_hostid, 0,
knet::TransportId::Udp,
&SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8000+(our_hostid.to_u16())),
&SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8000+(other_hostid.to_u16())),
knet::LinkFlags::NONE) {
return Err(e);
}
if let Err(e) = knet::handle_add_datafd(knet_handle, 0, CHANNEL) {
return Err(e);
}
if let Err(e) = knet::handle_crypto_rx_clear_traffic(knet_handle, knet::RxClearTraffic::Allow) {
return Err(e);
}
if let Err(e) = knet::link_set_enable(knet_handle, &other_hostid, 0, true) {
return Err(e);
}
if let Err(e) = knet::handle_setfwd(knet_handle, true) {
return Err(e);
}
Ok()
}
依赖项
~115–355KB