shared_raw_capture/
shared_raw_capture.rs1use 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}