recv_udp/
recv_udp.rs

1use osc_codec10::{decode_bundle, decode_message};
2use osc_types10::OscPacket;
3use std::net::UdpSocket;
4
5fn count_items_in_bundle(bundle: &osc_types10::Bundle) -> (usize, usize) {
6    let mut messages = 0;
7    let mut bundles = 0;
8    for packet in &bundle.packets {
9        match packet {
10            OscPacket::Message(_) => messages += 1,
11            OscPacket::Bundle(nested) => {
12                bundles += 1;
13                let (nested_msgs, nested_bundles) = count_items_in_bundle(nested);
14                messages += nested_msgs;
15                bundles += nested_bundles;
16            }
17        }
18    }
19    (messages, bundles)
20}
21
22fn main() -> std::io::Result<()> {
23    let sock = UdpSocket::bind("0.0.0.0:9000")?;
24    println!("listening on 9000");
25    let mut buf = [0u8; 65536];
26    loop {
27        let (n, _src) = sock.recv_from(&mut buf)?;
28        let data = &buf[..n];
29        // very simple heuristic: leading byte '/' => message, '#' => bundle
30        match data.first().copied() {
31            Some(b'/') => {
32                let (msg, used) = decode_message(data).expect("decode message");
33                assert_eq!(used, data.len());
34                println!("msg {} args={}", msg.address, msg.args.len());
35            }
36            Some(b'#') => {
37                let (bundle, _used) = decode_bundle(data).expect("decode bundle");
38                let (total_messages, total_bundles) = count_items_in_bundle(&bundle);
39                println!(
40                    "bundle timetag={} direct_packets={} total_messages={} total_bundles={}",
41                    bundle.timetag,
42                    bundle.packets.len(),
43                    total_messages,
44                    total_bundles
45                );
46            }
47            _ => eprintln!("unknown packet"),
48        }
49    }
50}