diff --git a/src/protocol/tcp.rs b/src/protocol/tcp.rs index f9369b4f..a7432883 100644 --- a/src/protocol/tcp.rs +++ b/src/protocol/tcp.rs @@ -5,18 +5,27 @@ use std::net::SocketAddr; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::net::{TcpListener, TcpStream}; +#[derive(Clone, Debug, Default)] +pub struct TcpOptions { + /// The time to live for the socket connection + pub ttl: Option, +} + #[async_trait] impl AsyncStreamProtocolListener for TcpListener { type AddressType = SocketAddr; type RemoteAddressType = SocketAddr; type Stream = TcpStream; - type ListenerOptions = (); + type ListenerOptions = TcpOptions; async fn protocol_bind( address: Self::AddressType, - _: Self::ListenerOptions, + options: Self::ListenerOptions, ) -> IPCResult { let listener = TcpListener::bind(address).await?; + if let Some(ttl) = options.ttl { + listener.set_ttl(ttl)?; + } Ok(listener) } @@ -40,13 +49,16 @@ impl AsyncProtocolStreamSplit for TcpStream { #[async_trait] impl AsyncProtocolStream for TcpStream { type AddressType = SocketAddr; - type StreamOptions = (); + type StreamOptions = TcpOptions; async fn protocol_connect( address: Self::AddressType, - _: Self::StreamOptions, + options: Self::StreamOptions, ) -> IPCResult { let stream = TcpStream::connect(address).await?; + if let Some(ttl) = options.ttl { + stream.set_ttl(ttl)?; + } Ok(stream) }