Skip to main content

shared_raw_capture/
shared_raw_capture.rs

1use mcrx_core::{RawSubscriptionConfig, SharedRawContext};
2use std::env;
3use std::error::Error;
4use std::net::IpAddr;
5use std::thread;
6use std::time::Duration;
7
8fn main() -> Result<(), Box<dyn Error>> {
9    let mut args = env::args().skip(1);
10    let Some(group) = args.next() else {
11        print_usage();
12        return Ok(());
13    };
14    let Some(interface) = args.next() else {
15        print_usage();
16        return Ok(());
17    };
18    let source = args.next();
19    if args.next().is_some() {
20        print_usage();
21        return Ok(());
22    }
23
24    let group: IpAddr = group.parse()?;
25    let interface: IpAddr = interface.parse()?;
26    let source_address = source.as_deref().map(str::parse).transpose()?;
27    let mut config = match source_address {
28        Some(source) => RawSubscriptionConfig::ssm_ip(group, source),
29        None => RawSubscriptionConfig::asm_ip(group),
30    };
31    config.interface = Some(interface);
32
33    let mut context = SharedRawContext::new();
34    let id = context.add_subscription(config)?;
35    context.join_subscription(id)?;
36
37    println!("shared raw capture ready");
38    println!("  group:      {group}");
39    println!("  interface:  {interface}");
40    println!("  source:     {}", source.as_deref().unwrap_or("any"));
41    println!("  sub_id:     {}", id.0);
42
43    loop {
44        if let Some(packet) = context.try_recv_any()? {
45            println!(
46                "received {} raw bytes matching {:?}",
47                packet.packet.datagram_len(),
48                packet.matching_subscription_ids()
49            );
50        } else {
51            thread::sleep(Duration::from_millis(10));
52        }
53    }
54}
55
56fn print_usage() {
57    eprintln!("usage: shared_raw_capture <group> <interface> [source]");
58    eprintln!("example: shared_raw_capture 239.1.2.3 192.168.1.20");
59    eprintln!("example: shared_raw_capture 232.1.2.3 192.168.1.20 192.168.1.10");
60}