Skip to main content

send_multicast/
send_multicast.rs

1//! Encode a frame and multicast it as PONK datagrams.
2//!
3//! Run with: `cargo run --example send_multicast`
4//!
5//! Pair with the `receive_reassemble` example (run the receiver first).
6
7use std::net::{Ipv4Addr, SocketAddr, UdpSocket};
8
9use ponk_protocol::{
10    DEFAULT_PORT, DataFormat, MULTICAST_ADDR, PonkFrame, PonkPath, PonkPoint, encode_datagrams,
11};
12
13// Keep each datagram within a typical Ethernet MTU.
14const MAX_DATAGRAM_LEN: usize = 1_472;
15
16fn main() -> std::io::Result<()> {
17    let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0))?;
18    socket.set_multicast_ttl_v4(1)?;
19    socket.set_multicast_loop_v4(true)?;
20
21    let target = SocketAddr::from((MULTICAST_ADDR, DEFAULT_PORT));
22
23    // A square drawn as one path.
24    let frame = PonkFrame {
25        sender_id: 0xC0FFEE,
26        sender_name: "send-multicast-example".to_string(),
27        frame_number: 0,
28        paths: vec![PonkPath {
29            metadata: vec![],
30            points: [
31                (-0.5, -0.5),
32                (0.5, -0.5),
33                (0.5, 0.5),
34                (-0.5, 0.5),
35                (-0.5, -0.5),
36            ]
37            .into_iter()
38            .map(|(x, y)| PonkPoint {
39                x,
40                y,
41                rgb: [0, 255, 255],
42            })
43            .collect(),
44        }],
45    };
46
47    let datagrams = encode_datagrams(&frame, DataFormat::XyF32RgbU8, MAX_DATAGRAM_LEN)
48        .expect("frame should encode");
49
50    for datagram in &datagrams {
51        socket.send_to(datagram, target)?;
52    }
53    println!(
54        "sent {} datagram(s) to {} (multicast group {:?})",
55        datagrams.len(),
56        target,
57        MULTICAST_ADDR,
58    );
59    Ok(())
60}