private void CloseSession() { if (State == ClientSessionState.Closed) { return; } _pipe.Close(); State = ClientSessionState.Closed; _log?.SessionClosed(); }
private ProcessingResult ProcessState() { _pipe.ReceiveMessages(); if (!_pipe.IsConnected || _pipe.IsReceiveTimeout()) { _log?.ConnectionLost(); CloseSession(); return(ProcessingResult.Error(SessionError.ConnectionError)); } switch (State) { case ClientSessionState.Joining: var joined = ProcessJoiningStateMessages(); if (joined) { State = ClientSessionState.WaitingPlayers; _log?.Joined(); return(ProcessingResult.Joined()); } break; case ClientSessionState.WaitingPlayers: TrySendKeepAlive(); var optMsgStart = ProcessWaitingStateMessages(); if (optMsgStart.HasValue) { State = ClientSessionState.Active; _log?.GameStarted(); return(ProcessingResult.Started(optMsgStart.Value)); } break; case ClientSessionState.Active: var optMsgFinish = ProcessActiveStateMessages(); if (optMsgFinish.HasValue) { CloseSession(); _log?.GameFinished(); return(ProcessingResult.Finished(optMsgFinish.Value)); } TrySendKeepAlive(); return(ProcessingResult.Active()); default: throw new ArgumentOutOfRangeException(); } return(ProcessingResult.None()); }
/// <summary> /// Checks the client session is timeout or not. /// </summary> /// <param name="maxSessionTimeout">maximum client session timeout milliseconds</param> /// <returns>timeout or not</returns> public bool CheckTimeout(int maxSessionTimeout) { bool isTimeout = false; TimeSpan ts = DateTime.Now.Subtract(SessionLastTime); int elapsedSeconds = Math.Abs((int)ts.TotalSeconds); if (elapsedSeconds > maxSessionTimeout) { CurrentSessionState = ClientSessionState.Inactive; isTimeout = true; } return(isTimeout); }
/// <summary> /// Initializes a new instance of the <see cref="ClientSession"/> class. /// </summary> /// <param name="sessionId">The session id.</param> /// <param name="socket">The socket.</param> /// <param name="rtspServer">The RtspServer object.</param> public ClientSession(int sessionId, Socket socket, RtspServer rtspServer) { base.ClientSessionId = sessionId; base.SessionConnectTime = DateTime.Now; base.SessionLastTime = base.SessionConnectTime; this.CurrentSessionState = ClientSessionState.Active; this.rtspServer = rtspServer; if (socket != null) { IPEndPoint iep = socket.RemoteEndPoint as IPEndPoint; if (iep != null) { base.ClientSessionIP = iep.Address.ToString(); base.ClientSessionPort = iep.Port; } } }
/// <summary> /// Begins tear down the client. /// </summary> private void BeginTeardown() { CurrentSessionState = ClientSessionState.Inactive; }
private void UpdateState(ClientSessionState state) { _state = state; StateChanged?.Invoke(this, EventArgs.Empty); }