Пример #1
0
        private void CloseSession()
        {
            if (State == ClientSessionState.Closed)
            {
                return;
            }

            _pipe.Close();
            State = ClientSessionState.Closed;
            _log?.SessionClosed();
        }
Пример #2
0
        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());
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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;
                }
            }
        }
Пример #5
0
 /// <summary>
 /// Begins tear down the client.
 /// </summary>
 private void BeginTeardown()
 {
     CurrentSessionState = ClientSessionState.Inactive;
 }
Пример #6
0
 private void UpdateState(ClientSessionState state)
 {
     _state = state;
     StateChanged?.Invoke(this, EventArgs.Empty);
 }