Skip to content

Instantly share code, notes, and snippets.

@stoiandan
Last active April 19, 2024 22:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stoiandan/0a1e29f6435a61b2e2d43182e1971549 to your computer and use it in GitHub Desktop.
Save stoiandan/0a1e29f6435a61b2e2d43182e1971549 to your computer and use it in GitHub Desktop.
Rust multicast
use std::net::{Ipv6Addr, SocketAddr, UdpSocket};
use std::str::FromStr;
use std::thread;
fn main() {
// Create a IPv6 multicast address
let multicast_addr =
Ipv6Addr::from_str("ff02::11").expect("Could not create multicast address");
// create a random upd socket
let socket = UdpSocket::bind("[::]:0").expect("Could not bind socket");
match socket.join_multicast_v6(&multicast_addr, 1) {
Ok(_) => println!("Joined multicast group"),
Err(e) => eprintln!("Failed to join multicast group: {}", e),
}
let partner_socket = UdpSocket::bind("[::]:0").expect("Could not bind partner socket");
match partner_socket.join_multicast_v6(&multicast_addr, 1) {
Ok(_) => println!("Partner joined multicast group"),
Err(e) => eprintln!("Partner failed to join multicast group: {}", e),
}
let handle = thread::spawn(move || {
let received_message_buff = &mut [0; 1024];
println!("Waiting for data...");
let (received_bytes_size, received_from_addr) = partner_socket
.recv_from(received_message_buff)
.expect("Could not receive message");
println!(
"Partner received {} bytes from {}:{}",
received_bytes_size,
received_from_addr.ip(),
received_from_addr.port()
);
});
let message = b"Hello world!";
let multicast_socket =
SocketAddr::from_str("[ff02::11]:0").expect("Could not create multicast socket");
let byte_size_sent = socket
.send_to(message, multicast_socket)
.expect("Could not send message");
println!("Succesfully sent {} bytes ", byte_size_sent);
let _ = handle.join();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment