Procházet zdrojové kódy

make server gracefully handle drops while establishing connections

Justin Tracey před 1 rokem
rodič
revize
22de85567f
1 změnil soubory, kde provedl 15 přidání a 2 odebrání
  1. 15 2
      src/bin/server.rs

+ 15 - 2
src/bin/server.rs

@@ -27,10 +27,23 @@ async fn main() -> Result<(), Box<dyn Error>> {
     let mut writer_db = HashMap::<ID, Updater<(OwnedWriteHalf, Arc<Notify>)>>::new();
 
     loop {
-        let (socket, _) = listener.accept().await?;
+        let socket = match listener.accept().await {
+            Ok((socket, _)) => socket,
+            Err(_) => {
+                log!("connection failed during accept");
+                continue;
+            }
+        };
         let (mut rd, wr) = socket.into_split();
 
-        let id = parse_identifier(&mut rd).await?;
+        let id = match parse_identifier(&mut rd).await {
+            Ok(id) => id,
+            Err(mgen::Error::Utf8Error(e)) => {
+                let err: Box<dyn Error> = Box::new(e);
+                return Err(err);
+            }
+            Err(_) => continue,
+        };
         log!("Accepting \"{id}\"");
         if let Some(socket_updater) = writer_db.get(&id) {
             // we've seen this client before