2个版本 (0个不稳定版本)

2.0.0-alpha1+1…2021年11月12日
2.0.0-alpha1+1…2021年6月23日

#2 in #high-availability

每月下载 30次

LGPL-2.1+

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