Skip to main content

send_and_receive/
send_and_receive.rs

1use std::net::{IpAddr, Ipv4Addr, SocketAddr};
2
3use tokio::time::{timeout, Duration};
4use tokio_multicast::MulticastSocket;
5
6#[tokio::main(flavor = "current_thread")]
7async fn main() -> Result<(), Box<dyn std::error::Error>> {
8    let group = Ipv4Addr::new(239, 1, 1, 11);
9    let receiver_port = 46055;
10    let sender_port = 46056;
11
12    let receiver = MulticastSocket::builder()
13        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, receiver_port)))
14        .join(IpAddr::V4(group))
15        .build()
16        .await?;
17
18    let sender = MulticastSocket::builder()
19        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, sender_port)))
20        .join(IpAddr::V4(group))
21        .build()
22        .await?;
23
24    sender
25        .send_to(b"hello multicast", SocketAddr::from((group, receiver_port)))
26        .await?;
27
28    let mut buf = [0_u8; 2048];
29    let (n, from) = timeout(Duration::from_secs(2), receiver.recv_from(&mut buf))
30        .await??
31        ;
32
33    println!("received {} bytes from {}", n, from);
34    println!("payload: {}", String::from_utf8_lossy(&buf[..n]));
35
36    Ok(())
37}