From 9c9855877db4fd93b5ae8d0e635baa64cb322920 Mon Sep 17 00:00:00 2001 From: open-trade Date: Mon, 10 Jan 2022 18:58:51 +0800 Subject: [PATCH] bind_multicast --- libs/hbb_common/src/udp.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libs/hbb_common/src/udp.rs b/libs/hbb_common/src/udp.rs index d1896bdbc..876180475 100644 --- a/libs/hbb_common/src/udp.rs +++ b/libs/hbb_common/src/udp.rs @@ -3,8 +3,8 @@ use anyhow::anyhow; use bytes::{Bytes, BytesMut}; use futures::{SinkExt, StreamExt}; use protobuf::Message; -use socket2::{Domain, Socket, Type}; -use std::net::SocketAddr; +use socket2::{Domain, Protocol, Socket, Type}; +use std::net::{SocketAddr, SocketAddrV4}; use tokio::net::{ToSocketAddrs, UdpSocket}; use tokio_socks::{udp::Socks5UdpFramed, IntoTargetAddr, TargetAddr, ToProxyAddrs}; use tokio_util::{codec::BytesCodec, udp::UdpFramed}; @@ -142,3 +142,18 @@ impl FramedSocket { } } } + +// const DEFAULT_MULTICAST: &str = "239.255.42.98"; + +pub fn bind_multicast(addr: &SocketAddrV4, multi_addr: &SocketAddrV4) -> ResultType { + assert!(multi_addr.ip().is_multicast(), "Must be multcast address"); + let socket = Socket::new(Domain::ipv4(), Type::dgram(), Some(Protocol::udp()))?; + socket.set_reuse_address(true)?; + socket.bind(&socket2::SockAddr::from(*addr))?; + socket.set_multicast_loop_v4(true)?; + socket.join_multicast_v4(multi_addr.ip(), addr.ip())?; + Ok(FramedSocket::Direct(UdpFramed::new( + UdpSocket::from_std(socket.into_udp_socket())?, + BytesCodec::new(), + ))) +}