Пример #1
0
        /// <summary>
        /// 새로운 클라이언트가 접속 성공했을 때 호출된다.
        /// AcceptAsync의 콜백 메소드에서 호출되며 여러 스레드에서 동시에 호출될 수 있기때문에 공유자원에 접근할 때는 주의해야 한다.
        /// </summary>
        private void OnNewClient(Socket clientSocket, object token)
        {
            // 플에서 하나 꺼내와 사용한다.
            SocketAsyncEventArgs receiveArgs = _receiveEventArgsPool.Pop();
            SocketAsyncEventArgs sendArgs    = _sendEventArgsPool.Pop();

            // UserToken은 매번 새로 생성하여 깨끗한 인스턴스로 넣어준다.
            UserToken userToken = new UserToken(LogicEntry);

            userToken.onSessionClosed += OnSessionClosed;
            receiveArgs.UserToken      = userToken;
            sendArgs.UserToken         = userToken;

            // 어째선지 여기에 두면 즉시 연결이 끊어진다...
            //userToken.SetSocket(clientSocket);

            UserManager.Add(userToken);

            userToken.OnConnected();
            if (SessionCreatedCallback != null)
            {
                SessionCreatedCallback(userToken);
            }

            BeginReceive(clientSocket, receiveArgs, sendArgs);

            Packet msg          = Packet.Create(UserToken.SYS_START_HEARTBEAT);
            byte   sendInterval = 5;

            msg.Push(sendInterval);
            //userToken.Send(msg);
        }
Пример #2
0
        public void Close()
        {
            // 중복 수행을 막는다.
            if (Interlocked.CompareExchange(ref isClosed, 1, 0) == 1)
            {
                return;
            }

            if (State == TokenState.Closed)
            {
                // already closed.
                return;
            }

            State = TokenState.Closed;
            if (Socket != null)
            {
                Socket.Close();
                Socket = null;
            }

            SendEventArgs.UserToken    = null;
            ReceiveEventArgs.UserToken = null;

            _sendingList.Clear();
            _messageResolver.ClearBuffer();

            if (_peer != null)
            {
                Packet msg = Packet.Create(SYS_CLOSE_ACK);
                if (_dispatcher == null)
                {
                    OnMessage(msg);
                }
                else
                {
                    _dispatcher.OnMessage(this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position));
                }
            }
        }
Пример #3
0
        void Send()
        {
            Packet msg = Packet.Create((short)UserToken.SYS_UPDATE_HEARTBEAT);

            _server.Send(msg);
        }
Пример #4
0
        /// <summary>
        /// 종료코드를 전송하여 상대방이 먼저 끊도록 한다.
        /// </summary>
        private void Byebye()
        {
            Packet bye = Packet.Create(SYS_CLOSE_REQ);

            Send(bye);
        }