Browse Source

handle offline

open-trade 5 years ago
parent
commit
66bbe7baa8
2 changed files with 13 additions and 3 deletions
  1. 1 1
      libs/hbb_common
  2. 12 2
      src/rendezvous_server.rs

+ 1 - 1
libs/hbb_common

@@ -1 +1 @@
1
-Subproject commit 9cccda60ea8d9e7006b2f5f35898e39c77a6c8d8
1
+Subproject commit 3d3d1bd1432f14341c7b90393206a787b95a1638

+ 12 - 2
src/rendezvous_server.rs

@@ -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 {