pub struct Puncher { /* private fields */ }Expand description
NAT hole punching coordinator.
Puncher manages the hole punching process, tracking attempts and
adapting strategies based on NAT type and previous results.
§Examples
use rust_p2p_core::punch::Puncher;
let puncher = Puncher::new(None, None);Implementations§
Source§impl Puncher
impl Puncher
Sourcepub fn new(
udp_socket_manager: Option<Arc<UdpSocketManager>>,
tcp_socket_manager: Option<Arc<TcpSocketManager>>,
) -> Puncher
pub fn new( udp_socket_manager: Option<Arc<UdpSocketManager>>, tcp_socket_manager: Option<Arc<TcpSocketManager>>, ) -> Puncher
Creates a new Puncher with the given socket managers.
§Arguments
udp_socket_manager- Optional UDP socket manager for UDP punchingtcp_socket_manager- Optional TCP socket manager for TCP punching
Source§impl Puncher
impl Puncher
Sourcepub fn need_punch(&self, punch_info: &PunchInfo) -> bool
pub fn need_punch(&self, punch_info: &PunchInfo) -> bool
Determines whether hole punching is needed for a peer.
Call this method periodically. It uses adaptive frequency based on previous attempts to avoid excessive punching.
§Arguments
punch_info- Information about the peer to punch
§Returns
true if punching should be attempted, false otherwise.
§Examples
if puncher.need_punch(&punch_info) {
// Perform punching
}Sourcepub async fn punch(&self, buf: &[u8], punch_info: PunchInfo) -> Result<()>
pub async fn punch(&self, buf: &[u8], punch_info: PunchInfo) -> Result<()>
Attempts hole punching if needed (convenience method).
This combines need_punch and punch_now into a single call.
§Arguments
buf- The data to send during punchingpunch_info- Information about the peer to punch
§Examples
let punch_info = PunchInfo::default();
puncher.punch(b"punch_data", punch_info).await?;Sourcepub async fn punch_now(
&self,
tcp_buf: Option<&[u8]>,
udp_buf: &[u8],
punch_info: PunchInfo,
) -> Result<()>
pub async fn punch_now( &self, tcp_buf: Option<&[u8]>, udp_buf: &[u8], punch_info: PunchInfo, ) -> Result<()>
Performs hole punching immediately without checking if it’s needed.
Attempts both TCP and UDP hole punching based on available socket managers and the peer’s NAT information.
§Arguments
tcp_buf- Optional TCP punch dataudp_buf- UDP punch datapunch_info- Information about the peer to punch
§Examples
let punch_info = PunchInfo::default();
puncher.punch_now(Some(b"tcp"), b"udp", punch_info).await?;Trait Implementations§
Source§impl From<&TunnelDispatcher> for Puncher
impl From<&TunnelDispatcher> for Puncher
Source§fn from(value: &TunnelDispatcher) -> Self
fn from(value: &TunnelDispatcher) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl Freeze for Puncher
impl !RefUnwindSafe for Puncher
impl Send for Puncher
impl Sync for Puncher
impl Unpin for Puncher
impl !UnwindSafe for Puncher
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more