3个版本

0.1.2 2021年3月7日
0.1.1 2020年9月22日
0.1.0 2020年9月22日

#6 in #attach

MIT许可证

36KB
853

tipc

Rust为一些常见的Linux TIPC操作提供绑定。

先决条件

  • Linux操作系统(版本 >= 4.14 以支持通信组)
  • Clang编译器
  • 启用TIPC内核模块(sudo modprobe tipc

构建tipc

$ git clone https://github.com/doyshinda/tipc.git
$ cd tipc
$ cargo build [--release]

测试

默认情况下,Rust会并行运行测试,当许多不同的测试试图创建/加入相同的TIPC组时,这会导致混乱。请使用以下make目标,该目标将测试线程数固定为1

$ make test

或者,您可以直接调用以下cargo命令

cargo test -- --test-threads=1

示例

将TIPC附加到接口,以便与其他网络上的节点通信

use tipc::attach_to_interface;
attach_to_interface("eth0").unwrap();

打开套接字,绑定到地址并监听消息

use tipc::{TipcConn, SockType, TipcScope};
let conn = TipcConn::new(SockType::SockRdm).unwrap();

conn.bind(12345, 0, 0, TipcScope::Cluster).expect("Unable to bind to address");
let mut buf: [u8; tipc::MAX_MSG_SIZE] = [0; tipc::MAX_MSG_SIZE];
loop {
    let msg_size = conn.recv(&mut buf).unwrap();
    println!("received: {}", std::str::from_utf8(&buf[0..msg_size as usize]).unwrap())
}

在网络上的另一台机器上

use std::{thread, time};
use tipc::{TipcConn, SockType, TipcScope};
let conn = TipcConn::new(SockType::SockRdm).unwrap();

let n = 0;
loop {
    let data = format!("Client multicast testing {}", n);
    conn.multicast(data.as_bytes(), 12345, 0, 0, TipcScope::Cluster).unwrap();
    n += 1;
    thread::sleep(time::Duration::from_secs(1));
}

加入一个组并监听组成员事件或消息

注意:加入组会自动绑定到地址,如果组不存在,则会创建它。

use tipc::{TipcConn, SockType, TipcScope, GroupMessage};
let mut conn = TipcConn::new(SockType::SockRdm).unwrap();

conn.join(12345, 1, TipcScope::Cluster).expect("Unable to join group");

// Listen for messages
loop {
    match conn.recvfrom().unwrap() {
        GroupMessage::MemberEvent(e) => {
            let action = if e.joined() { "joined" } else { "left" };
            println!("group member {}:{} {}", e.socket_ref(), e.node_ref(), action);
        },
        GroupMessage::DataEvent(d) => {
            println!("received message: {}", std::str::from_utf8(&d).unwrap());
        }
    }
}

依赖项

~0–2.2MB
~39K SLoC