Skip to content

Commit

Permalink
protocols/dcutr/example: Wait for relay to accept reservation request
Browse files Browse the repository at this point in the history
When in listening mode, wait for the relay to accept our reservation
request. Only then can a client in dialing mode establish a relayed
connection to us via the relay.

See also
libp2p#2621 (comment)
  • Loading branch information
mxinden committed May 11, 2022
1 parent f04f6bb commit 665913f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
22 changes: 19 additions & 3 deletions protocols/dcutr/examples/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,25 +197,41 @@ fn main() -> Result<(), Box<dyn Error>> {
}
}

// Wait till connected to relay to learn external address.
// Wait till connected to relay to learn external address. In case we are in listening mode,
// wait for the relay to accept our reservation request.
block_on(async {
let mut learned_observed_addr = false;
let mut relay_accepted_reservation = false;

loop {
match swarm.next().await.unwrap() {
SwarmEvent::NewListenAddr { .. } => {}
SwarmEvent::Dialing { .. } => {}
SwarmEvent::ConnectionEstablished { .. } => {}
SwarmEvent::Behaviour(Event::Ping(_)) => {}
SwarmEvent::Behaviour(Event::Relay(client::Event::ReservationReqAccepted {
..
})) => {
info!("Relay accepted our reservation request.");
relay_accepted_reservation = true
}
SwarmEvent::Behaviour(Event::Relay(_)) => {}
SwarmEvent::Behaviour(Event::Identify(IdentifyEvent::Sent { .. })) => {}
SwarmEvent::Behaviour(Event::Identify(IdentifyEvent::Received {
info: IdentifyInfo { observed_addr, .. },
..
})) => {
info!("Observed address: {:?}", observed_addr);
break;
info!("Relay observes us under the address: {:?}", observed_addr);
learned_observed_addr = true;
}
event => panic!("{:?}", event),
}

if learned_observed_addr
&& (matches!(opts.mode, Mode::Dial) || relay_accepted_reservation)
{
break;
}
}
});

Expand Down
8 changes: 7 additions & 1 deletion src/tutorials/hole_punching.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,20 @@
//!
//! ``` bash
//! RUST_LOG=info ./client --secret-key-seed 1 --mode listen --relay-address /ip4/$RELAY_SERVER_IP/tcp/4001/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN
//!
//! [2022-05-11T10:38:52Z INFO client] Local peer id: PeerId("XXX")
//! [2022-05-11T10:38:52Z INFO client] Listening on "/ip4/127.0.0.1/tcp/44703"
//! [2022-05-11T10:38:52Z INFO client] Listening on "/ip4/XXX/tcp/44703"
//! [2022-05-11T10:38:54Z INFO client] Relay accepted our reservation request.
//! [2022-05-11T10:38:54Z INFO client] Relay observes us under the address: "/ip4/XXX/tcp/53160"
//! ```
//!
//! Now let's make sure that the listening client is not public, in other words let's make sure one
//! can not reach it directly through the Internet. From the dialing client test that you can not
//! connect on Layer 4 (TCP):
//!
//! ``` bash
//! telnet $RELAY_SERVER_IP 4001
//! telnet $LISTENING_CLIENT_IP_OBSERVED_BY_RELAY 53160
//! ```
//!
//! ## Connecting to the listening client from the dialing client
Expand Down

0 comments on commit 665913f

Please sign in to comment.