|
|
@@ -2,13 +2,15 @@ use hbb_common::{
|
|
2
|
2
|
allow_err, bytes::BytesMut, log, protobuf::parse_from_bytes, rendezvous_proto::*,
|
|
3
|
3
|
tcp::new_listener, tokio, udp::FramedSocket, AddrMangle, ResultType,
|
|
4
|
4
|
};
|
|
5
|
|
-use std::{collections::HashMap, net::SocketAddr};
|
|
|
5
|
+use std::{collections::HashMap, net::SocketAddr, time::Instant};
|
|
6
|
6
|
|
|
7
|
7
|
pub struct Peer {
|
|
8
|
8
|
socket_addr: SocketAddr,
|
|
|
9
|
+ last_reg_time: Instant,
|
|
9
|
10
|
}
|
|
10
|
11
|
|
|
11
|
12
|
type PeerMap = HashMap<String, Peer>;
|
|
|
13
|
+const REG_TIMEOUT: i32 = 30_000;
|
|
12
|
14
|
|
|
13
|
15
|
pub struct RendezvousServer {
|
|
14
|
16
|
peer_map: PeerMap,
|
|
|
@@ -47,7 +49,7 @@ impl RendezvousServer {
|
|
47
|
49
|
// B registered
|
|
48
|
50
|
if rp.id.len() > 0 {
|
|
49
|
51
|
log::debug!("New peer registered: {:?} {:?}", &rp.id, &addr);
|
|
50
|
|
- self.peer_map.insert(rp.id, Peer { socket_addr: addr });
|
|
|
52
|
+ self.peer_map.insert(rp.id, Peer { socket_addr: addr, last_reg_time: Instant::now() });
|
|
51
|
53
|
let mut msg_out = RendezvousMessage::new();
|
|
52
|
54
|
msg_out.set_register_peer_response(RegisterPeerResponse::default());
|
|
53
|
55
|
socket.send(&msg_out, addr).await?
|
|
|
@@ -60,6 +62,14 @@ impl RendezvousServer {
|
|
60
|
62
|
// because punch hole won't work if in the same intranet,
|
|
61
|
63
|
// all routers will drop such self-connections.
|
|
62
|
64
|
if let Some(peer) = self.peer_map.get(&ph.id) {
|
|
|
65
|
+ if peer.last_reg_time.elapsed().as_millis() as i32 >= REG_TIMEOUT {
|
|
|
66
|
+ let mut msg_out = RendezvousMessage::new();
|
|
|
67
|
+ msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
|
68
|
+ failure: punch_hole_response::Failure::OFFLINE.into(),
|
|
|
69
|
+ ..Default::default()
|
|
|
70
|
+ });
|
|
|
71
|
+ return socket.send(&msg_out, addr).await;
|
|
|
72
|
+ }
|
|
63
|
73
|
let mut msg_out = RendezvousMessage::new();
|
|
64
|
74
|
let same_intranet = match peer.socket_addr {
|
|
65
|
75
|
SocketAddr::V4(a) => match addr {
|