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
…#2642)

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
#2621 (comment)
  • Loading branch information
mxinden committed May 19, 2022
1 parent d4c1292 commit 0e9ab1c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
29 changes: 25 additions & 4 deletions protocols/dcutr/examples/client.rs
Expand Up @@ -197,25 +197,46 @@ 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(_)) => {}
SwarmEvent::Behaviour(Event::Relay(client::Event::ReservationReqAccepted {
..
})) => {
info!("Relay accepted our reservation request.");
relay_accepted_reservation = true
}
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),
}

// Check whether we are done.

if !learned_observed_addr {
continue;
}

if opts.mode == Mode::Listen && !relay_accepted_reservation {
continue;
}

break;
}
});

Expand Down
8 changes: 7 additions & 1 deletion src/tutorials/hole_punching.rs
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 0e9ab1c

Please sign in to comment.