diff options
Diffstat (limited to 'mumd/src/network/udp.rs')
| -rw-r--r-- | mumd/src/network/udp.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/mumd/src/network/udp.rs b/mumd/src/network/udp.rs index 5f76501..cf0305b 100644 --- a/mumd/src/network/udp.rs +++ b/mumd/src/network/udp.rs @@ -1,3 +1,4 @@ +use crate::network::ConnectionInfo; use crate::state::State; use log::*; @@ -11,6 +12,7 @@ use mumble_protocol::Serverbound; use std::net::{Ipv6Addr, SocketAddr}; use std::sync::{Arc, Mutex}; use tokio::net::UdpSocket; +use tokio::sync::watch; use tokio_util::udp::UdpFramed; type UdpSender = SplitSink<UdpFramed<ClientCryptState>, (VoicePacket<Serverbound>, SocketAddr)>; @@ -38,20 +40,27 @@ pub async fn connect( pub async fn handle( state: Arc<Mutex<State>>, - server_addr: SocketAddr, + mut connection_info_receiver: watch::Receiver<Option<ConnectionInfo>>, crypt_state: oneshot::Receiver<ClientCryptState>, ) { + let connection_info = loop { + match connection_info_receiver.recv().await { + None => { return; } + Some(None) => {} + Some(Some(connection_info)) => { break connection_info; } + } + }; let (mut sink, source) = connect(crypt_state).await; // Note: A normal application would also send periodic Ping packets, and its own audio // via UDP. We instead trick the server into accepting us by sending it one // dummy voice packet. - send_ping(&mut sink, server_addr).await; + send_ping(&mut sink, connection_info.socket_addr).await; let sink = Arc::new(Mutex::new(sink)); join!( listen(Arc::clone(&state), source), - send_voice(state, sink, server_addr) + send_voice(state, sink, connection_info.socket_addr), ); } |
