public void UpdateNetworkEvents() { void handleReceivedData(IRemote source, INetworkData data, ResponseHandler responseHandler) { if (!(source is IRemoteServer server)) { Log.Error.Write(ErrorSystemType.Network, "Client received data from a non-server."); responseHandler?.Invoke(ResponseType.BadDestination); return; } ProcessData(server, data, responseHandler); } NetworkDataReceiver?.ProcessReceivedData(handleReceivedData); if (Game != null && client != null && client.Connected) { lock (Game) { var gameTime = Game.GameTime; // Save game state from time to time to avoid huge syncs. if (gameTime - lastSavedGameStateGameTime >= SavedGameState.SyncDelay && SavedGameState.TimeToSync(Game)) { Log.Verbose.Write(ErrorSystemType.Network, $"Saving game state with game time {Misc.SecondsToTime(gameTime)}."); lastSavedGameStateGameTime = gameTime; lastSavedGameStates.Add(gameTime, SavedGameState.FromGame(Game)); Log.Verbose.Write(ErrorSystemType.Network, $"Finished saving game state with game time {Misc.SecondsToTime(gameTime)}."); } } } }
void Server_DataReceived(IRemoteServer server, byte[] data) { Log.Verbose.Write(ErrorSystemType.Network, $"Received {data.Length} byte(s) of data from server '{server.Ip}'."); lastServerHeartbeat = DateTime.UtcNow; if (NetworkDataReceiver == null) { Log.Error.Write(ErrorSystemType.Application, "Network data receiver is not set up."); Disconnect(); return; } if (serverState == ServerState.Offline) { serverState = ServerState.Lobby; } try { foreach (var parsedData in NetworkDataParser.Parse(data)) { Log.Verbose.Write(ErrorSystemType.Network, $"Received {parsedData.LogName} (message index {parsedData.MessageIndex})."); switch (parsedData.Type) { case NetworkDataType.Heartbeat: // Last heartbeat time was set above. if (parsedData.MessageIndex != Global.SpontaneousMessage) { // If it has a message index, it is an answer to a heartbeat request. NetworkDataReceiver.Receive(server, parsedData, null); } break; case NetworkDataType.Request: case NetworkDataType.LobbyData: case NetworkDataType.SyncData: NetworkDataReceiver.Receive(server, parsedData, (ResponseType responseType) => SendResponse(parsedData.MessageIndex, responseType)); break; case NetworkDataType.Response: case NetworkDataType.InSync: NetworkDataReceiver.Receive(server, parsedData, null); break; case NetworkDataType.UserActionData: Log.Error.Write(ErrorSystemType.Network, "User actions can't be send to a client."); SendResponse(parsedData.MessageIndex, ResponseType.BadDestination); break; default: Log.Error.Write(ErrorSystemType.Network, "Received unknown server data."); SendResponse(parsedData.MessageIndex, ResponseType.BadRequest); break; } } } catch (Exception ex) { Log.Error.Write(ErrorSystemType.Network, "Error in receiving server data: " + ex.Message); } }