4个版本 (2个破坏性版本)

0.3.0 2023年9月23日
0.2.0 2023年7月21日
0.1.1 2022年6月9日
0.1.0 2022年6月8日

macOS 和 iOS APIs中排名第83

每月下载量48

MIT许可证

38KB
847 行代码(不含注释)

vmnet

Docs.rs

Rust对Apple的vmnet.framework的绑定。

安装

将以下内容添加到您的Cargo.toml

[dependencies]
vmnet = "0"

使用

确保您的软件具有com.apple.vm.networking权限或以提升权限运行。

启动NAT接口并接收一些目标为它的数据包

let shared_mode = Shared {
    subnet_options: None,
    ..Default::default()
};

let mut iface = Interface::new(Mode::Shared(shared_mode), Options::default()).unwrap();

let (tx, rx) = sync::mpsc::sync_channel(0);

iface.set_event_callback(Events::PACKETS_AVAILABLE, move |events, params| {
    if let Some(Parameter::EstimatedPacketsAvailable(pkts)) = params.get(ParameterKind::EstimatedPacketsAvailable) {
        tx.send(pkts);
    }
}).unwrap();

let pkts = rx.recv().unwrap();
println!("receiving {} packets...", pkts);
for _ in 0..pkts {
    let mut buf: [u8; 1514] = [0; 1514];
    println!("{:?}", iface.read(&mut buf));
}

drop(rx);
iface.finalize().unwrap();

怪癖和缺失的功能

  • 由于Apple使用blocks作为获取API调用结果的方式,因此一些方法,如set_event_callback(),需要提供的闭包具有'static生命周期
    • 这体现在无法从这样的闭包中使用Interface
    • 然而,这可以通过使用内部可变性模式或简单地使用回调作为信号载体来轻松解决
  • 不支持端口转发
  • 由于API_AVAILABLE宏不受支持,假定此包在macOS 11.0或更高版本上运行

依赖关系

~2.5MB
~53K SLoC