M server/src/main.rs => server/src/main.rs +9 -2
@@ 37,8 37,15 @@ async fn handle_request(conn: TcpStream, remote_addr: SocketAddr, mgr: ClientMan
async fn _handle_request(mut conn: TcpStream, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) -> Result<(), Box<dyn Error>> {
let mut peek_buf = [0u8; 9];
- let read = conn.peek(&mut peek_buf).await?;
- if read == 9 && peek_buf == *b"GET /ping" {
+
+ loop {
+ let read = conn.peek(&mut peek_buf).await?;
+ if read == 9 {
+ break;
+ }
+ }
+
+ if peek_buf == *b"GET /ping" {
info!("[{}] incoming http connection", remote_addr);
let ping_resp = serde_json::to_string(&ServerPingResponse {
version: ServerPingResponseVersion {
M server/src/timer.rs => server/src/timer.rs +11 -1
@@ 76,7 76,12 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
}
}
- for (_addr, client_thread) in mgr.handlers.read().await.iter() {
+ let mut to_remove = vec![];
+
+ let mut mgr_w = mgr.handlers.write().await;
+ let mgr_r = mgr_w.clone();
+
+ for (addr, client_thread) in mgr_r.iter() {
match client_thread.tx.send(ClientHandlerMessage::Tick).await {
Ok(_) => {
match client_thread.tx.send(ClientHandlerMessage::PlayersUpdate {players: protocol_players.clone()}).await {
@@ 97,8 102,13 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
}
Err(e) => {
error!("unable to update a client thread: {}", e);
+ to_remove.push(addr);
}
}
}
+
+ for pending_removal in to_remove {
+ mgr_w.remove(pending_removal);
+ }
}
}