Просмотр исходного кода

peer_online_state: response online state bits

Signed-off-by: fufesou <shuanglongchen@yeah.net>
fufesou лет назад: 3
Родитель
Сommit
f7fc45a3d2
2 измененных файлов с 15 добавлено и 38 удалено
  1. 1 2
      libs/hbb_common/protos/rendezvous.proto
  2. 14 36
      src/rendezvous_server.rs

+ 1 - 2
libs/hbb_common/protos/rendezvous.proto

@@ -154,8 +154,7 @@ message OnlineRequest {
154 154
 }
155 155
 
156 156
 message OnlineResponse {
157
-  repeated string onlines = 1;
158
-  repeated string offlines = 2;
157
+  bytes states = 1;
159 158
 }
160 159
 
161 160
 message RendezvousMessage {

+ 14 - 36
src/rendezvous_server.rs

@@ -89,12 +89,7 @@ enum LoopFailure {
89 89
 
90 90
 impl RendezvousServer {
91 91
     #[tokio::main(flavor = "multi_thread")]
92
-    pub async fn start(
93
-        port: i32,
94
-        serial: i32,
95
-        key: &str,
96
-        rmem: usize,
97
-    ) -> ResultType<()> {
92
+    pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
98 93
         let (key, sk) = Self::get_server_sk(key);
99 94
         let addr = format!("0.0.0.0:{}", port);
100 95
         let addr2 = format!("0.0.0.0:{}", port - 1);
@@ -762,27 +757,26 @@ impl RendezvousServer {
762 757
         stream: &mut FramedStream,
763 758
         peers: Vec<String>,
764 759
     ) -> ResultType<()> {
765
-        let mut onlines = Vec::new();
766
-        for peer_id in &peers {
760
+        let mut states = BytesMut::zeroed((peers.len() + 7) / 8);
761
+        for i in 0..peers.len() {
762
+            let peer_id = &peers[i];
763
+            // bytes index from left to right
764
+            let states_idx = i / 8;
765
+            let bit_idx = 7 - i % 8;
767 766
             if let Some(peer) = self.pm.get_in_memory(&peer_id).await {
768 767
                 let (elapsed, _) = {
769 768
                     let r = peer.read().await;
770 769
                     (r.last_reg_time.elapsed().as_millis() as i32, r.socket_addr)
771 770
                 };
772 771
                 if elapsed < REG_TIMEOUT {
773
-                    onlines.push(peer_id.clone());
772
+                    states[states_idx] |= 0x01 << bit_idx;
774 773
                 }
775 774
             }
776 775
         }
777
-        let offlines = peers
778
-            .into_iter()
779
-            .filter(|p| onlines.iter().position(|r| r == p).is_none())
780
-            .collect::<Vec<_>>();
781 776
 
782 777
         let mut msg_out = RendezvousMessage::new();
783 778
         msg_out.set_online_response(OnlineResponse {
784
-            onlines,
785
-            offlines,
779
+            states: states.into(),
786 780
             ..Default::default()
787 781
         });
788 782
         stream.send(&msg_out).await?;
@@ -1079,29 +1073,19 @@ impl RendezvousServer {
1079 1073
                         Some(rendezvous_message::Union::OnlineRequest(or)) => {
1080 1074
                             allow_err!(rs.handle_online_request(&mut stream, or.peers).await);
1081 1075
                         }
1082
-                        _ => {
1083
-                        }
1076
+                        _ => {}
1084 1077
                     }
1085 1078
                 }
1086 1079
             }
1087 1080
         });
1088 1081
     }
1089 1082
 
1090
-    async fn handle_listener(
1091
-        &self,
1092
-        stream: TcpStream,
1093
-        addr: SocketAddr,
1094
-        key: &str,
1095
-        ws: bool,
1096
-    ) {
1083
+    async fn handle_listener(&self, stream: TcpStream, addr: SocketAddr, key: &str, ws: bool) {
1097 1084
         log::debug!("Tcp connection from {:?}, ws: {}", addr, ws);
1098 1085
         let mut rs = self.clone();
1099 1086
         let key = key.to_owned();
1100 1087
         tokio::spawn(async move {
1101
-            allow_err!(
1102
-                rs.handle_listener_inner(stream, addr, &key, ws)
1103
-                    .await
1104
-            );
1088
+            allow_err!(rs.handle_listener_inner(stream, addr, &key, ws).await);
1105 1089
         });
1106 1090
     }
1107 1091
 
@@ -1121,10 +1105,7 @@ impl RendezvousServer {
1121 1105
             while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {
1122 1106
                 match msg {
1123 1107
                     tungstenite::Message::Binary(bytes) => {
1124
-                        if !self
1125
-                            .handle_tcp(&bytes, &mut sink, addr, key, ws)
1126
-                            .await
1127
-                        {
1108
+                        if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
1128 1109
                             break;
1129 1110
                         }
1130 1111
                     }
@@ -1135,10 +1116,7 @@ impl RendezvousServer {
1135 1116
             let (a, mut b) = Framed::new(stream, BytesCodec::new()).split();
1136 1117
             sink = Some(Sink::TcpStream(a));
1137 1118
             while let Ok(Some(Ok(bytes))) = timeout(30_000, b.next()).await {
1138
-                if !self
1139
-                    .handle_tcp(&bytes, &mut sink, addr, key, ws)
1140
-                    .await
1141
-                {
1119
+                if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
1142 1120
                     break;
1143 1121
                 }
1144 1122
             }