Skip to main content

MulticastSocket

Struct MulticastSocket 

Source
pub struct MulticastSocket { /* private fields */ }

Implementations§

Source§

impl MulticastSocket

Source

pub fn builder() -> MulticastSocketBuilder

Examples found in repository?
examples/simple_receiver.rs (line 8)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Listens on a multicast group until interrupted.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 46053)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 10)))
11        .build()
12        .await?;
13
14    let mut buf = [0_u8; 2048];
15    loop {
16        let (n, from) = socket.recv_from(&mut buf).await?;
17        println!("received {n} bytes from {from}");
18    }
19}
More examples
Hide additional examples
examples/simple_sender.rs (line 8)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Sends a single datagram to the same group used by simple_receiver.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 46054)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 10)))
11        .build()
12        .await?;
13
14    socket
15        .send_to(
16            b"hello multicast",
17            SocketAddr::from((Ipv4Addr::new(239, 1, 1, 10), 46053)),
18        )
19        .await?;
20    Ok(())
21}
examples/multi_group.rs (line 8)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Joins multiple groups and prints the tracked membership count.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 5000)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 1)))
11        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 2)))
12        .build()
13        .await?;
14
15    println!("listening on {}", socket.local_addr()?);
16    let groups = socket.memberships();
17    println!("joined {} groups", groups.len());
18    Ok(())
19}
examples/ssm.rs (line 8)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Placeholder example for the future source-specific multicast path.
8    let result = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 5000)))
10        .join_source(
11            IpAddr::V4(Ipv4Addr::new(232, 1, 1, 1)),
12            IpAddr::V4(Ipv4Addr::new(192, 168, 1, 10)),
13        )
14        .build()
15        .await;
16
17    match result {
18        Ok(_) => println!("source-specific multicast socket created"),
19        Err(err) => println!("source-specific multicast is not implemented yet: {err}"),
20    }
21
22    Ok(())
23}
examples/send_and_receive.rs (line 12)
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}
Source

pub fn local_addr(&self) -> Result<SocketAddr>

Examples found in repository?
examples/multi_group.rs (line 15)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Joins multiple groups and prints the tracked membership count.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 5000)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 1)))
11        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 2)))
12        .build()
13        .await?;
14
15    println!("listening on {}", socket.local_addr()?);
16    let groups = socket.memberships();
17    println!("joined {} groups", groups.len());
18    Ok(())
19}
Source

pub fn config(&self) -> &MulticastConfig

Source

pub fn memberships(&self) -> HashSet<Membership>

Examples found in repository?
examples/multi_group.rs (line 16)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Joins multiple groups and prints the tracked membership count.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 5000)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 1)))
11        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 2)))
12        .build()
13        .await?;
14
15    println!("listening on {}", socket.local_addr()?);
16    let groups = socket.memberships();
17    println!("joined {} groups", groups.len());
18    Ok(())
19}
Source

pub async fn join(&self, membership: Membership) -> Result<()>

Source

pub async fn leave(&self, membership: &Membership) -> Result<()>

Source

pub async fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>

Examples found in repository?
examples/simple_receiver.rs (line 16)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Listens on a multicast group until interrupted.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 46053)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 10)))
11        .build()
12        .await?;
13
14    let mut buf = [0_u8; 2048];
15    loop {
16        let (n, from) = socket.recv_from(&mut buf).await?;
17        println!("received {n} bytes from {from}");
18    }
19}
More examples
Hide additional examples
examples/send_and_receive.rs (line 29)
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}
Source

pub async fn recv(&self, buf: &mut [u8]) -> Result<usize>

Source

pub async fn recv_datagram(&self, buf_size: usize) -> Result<Datagram>

Source

pub async fn send_to(&self, payload: &[u8], target: SocketAddr) -> Result<usize>

Examples found in repository?
examples/simple_sender.rs (lines 15-18)
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Sends a single datagram to the same group used by simple_receiver.
8    let socket = MulticastSocket::builder()
9        .bind(SocketAddr::from((Ipv4Addr::UNSPECIFIED, 46054)))
10        .join(IpAddr::V4(Ipv4Addr::new(239, 1, 1, 10)))
11        .build()
12        .await?;
13
14    socket
15        .send_to(
16            b"hello multicast",
17            SocketAddr::from((Ipv4Addr::new(239, 1, 1, 10), 46053)),
18        )
19        .await?;
20    Ok(())
21}
More examples
Hide additional examples
examples/send_and_receive.rs (line 25)
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}
Source

pub async fn send_to_group(&self, payload: &[u8]) -> Result<usize>

Trait Implementations§

Source§

impl Debug for MulticastSocket

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.