properly handle disconnections in interserver connections
This commit is contained in:
parent
e3e5bff300
commit
578e4c7cf8
@ -39,7 +39,7 @@ impl MessageReceiver {
|
||||
let size = u32::from_le_bytes(size_buf) as usize;
|
||||
|
||||
let mut payload = vec![0u8; size];
|
||||
self.socket.read_exact(&mut payload).await.map_err(|err| MessageReceiverError::Disconnected)?;
|
||||
self.socket.read_exact(&mut payload).await.map_err(|_| MessageReceiverError::Disconnected)?;
|
||||
let payload = String::from_utf8(payload).map_err(|_| MessageReceiverError::InvalidPayload)?;
|
||||
|
||||
let msg = serde_json::from_str(&payload).map_err(|_| MessageReceiverError::InvalidPayload)?;
|
||||
@ -65,7 +65,13 @@ where
|
||||
|
||||
loop {
|
||||
info!("interserver loop");
|
||||
let action = action_receiver.recv().await.unwrap();
|
||||
let action = match action_receiver.recv().await {
|
||||
Ok(action) => action,
|
||||
Err(err) => {
|
||||
warn!("error in iterserver state loop {:?}", err);
|
||||
continue;
|
||||
}
|
||||
};
|
||||
let mut state = state.lock().await;
|
||||
|
||||
match action {
|
||||
@ -94,12 +100,12 @@ where
|
||||
},
|
||||
InterserverInputAction::Disconnect(server_id) => {
|
||||
let actions = state.on_disconnect(server_id).await;
|
||||
ships.remove(&server_id);
|
||||
for (server, action) in actions {
|
||||
if let Some(sender) = ships.get_mut(&server) {
|
||||
sender.send(action).await;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -164,7 +170,8 @@ where
|
||||
}
|
||||
},
|
||||
Err(err) => {
|
||||
warn!("error in send_loop: {:?}, {:?}", server_id, err)
|
||||
warn!("error in send_loop: {:?}, {:?}", server_id, err);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -204,20 +211,33 @@ pub fn ship_connect_mainloop<EG: EntityGateway + 'static>(state: Arc<Mutex<ShipS
|
||||
interserver_state_loop(state, server_state_receiver).await;
|
||||
|
||||
loop {
|
||||
let socket = async_std::net::TcpStream::connect((ip, port)).await.unwrap();
|
||||
info!("trying to connect to loginserv");
|
||||
let socket = match async_std::net::TcpStream::connect((ip, port)).await {
|
||||
Ok(socket) => socket,
|
||||
Err(err) => {
|
||||
info!("err trying to connect to loginserv {:?}", err);
|
||||
async_std::task::sleep(Duration::from_secs(10)).await;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
id += 1;
|
||||
let server_id = crate::common::interserver::ServerId(id);
|
||||
info!("found loginserv: {:?} {:?}", server_id, socket);
|
||||
let (client_sender, client_receiver) = async_std::sync::channel(64);
|
||||
|
||||
info!("ship connected to login: {:?}", socket);
|
||||
login_recv_loop(server_id, socket.clone(), server_state_sender.clone(), client_sender).await;
|
||||
interserver_send_loop(server_id, socket.clone(), client_receiver).await;
|
||||
|
||||
let mut buf = [0u8; 1];
|
||||
loop {
|
||||
if let Err(_) = socket.peer_addr() {
|
||||
info!("ship connected to login: {:?}", socket);
|
||||
break;
|
||||
let peek = socket.peek(&mut buf).await;
|
||||
match peek {
|
||||
Ok(len) if len == 0 => {
|
||||
break
|
||||
},
|
||||
_ => {
|
||||
}
|
||||
}
|
||||
async_std::task::sleep(Duration::from_secs(10)).await;
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
Loading…
x
Reference in New Issue
Block a user