using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using ControlCenter.NamedPipe; using ServerControlCenter; namespace GameServer.Monitor.PacketHandler; public class ForceStopServerMessageReceiver : NamedPipeReceiver { public ForceStopServerMessageReceiver() { } public override async Task Handle(A2S_REQ_FORCE_STOP_SERVER message, string message_id) { Log.getLogger().debug($"{nameof(ForceStopServerMessageReceiver)}: Receive - message_id[{message_id}] / message[{message}]"); var server_logic = GameServerApp.getServerLogic(); var proud_net_listener = server_logic.getProudNetListener(); await proud_net_listener.onLogoutUserAllByKick(); await NamedPipeMonitor.ChangeServerStatus(ServerStatus.ReserveToStop); var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(1_000)); while (true) { await timer.WaitForNextTickAsync(); var can_stop = CheckServerStatusForStopAsync(); if (can_stop) { break; } } timer.Dispose(); // process 종료 await server_logic.onStopServer(); Environment.Exit(0); } private bool CheckServerStatusForStopAsync() { var server_logic = GameServerApp.getServerLogic(); var proud_net_listener = GameServerApp.getServerLogic().getProudNetListener(); var check_count = proud_net_listener.getEntityWithSessions().Count; Log.getLogger().debug($"server_name:[{server_logic.getServerName()}] / check_count: [{check_count}]"); //조건 1. 현재 Client Session 수 체크 return check_count <= 0; } }