Пример #1
0
        /// <summary>
        /// 새로운 클라이언트가 접속 성공 했을 때 호출됩니다.
        /// AcceptAsync의 콜백 매소드에서 호출되며 여러 스레드에서 동시에 호출될 수 있기 때문에 공유자원에 접근할 때는 주의해야 합니다.
        /// </summary>
        /// <param name="client_socket"></param>
        void OnNewClient(Socket client_socket, object token)
        {
            // UserToken은 매번 새로 생성하여 깨끗한 인스턴스로 넣어준다.
            var uniqueId   = MakeSequenceIdForSession();
            var user_token = new Session(true, uniqueId, PacketDispatcher, MessageResolver, ServerOpt);

            user_token.OnSessionClosed += OnSessionClosed;


            UserManager.Add(user_token);

            // 플에서 하나 꺼내와 사용한다.
            SocketAsyncEventArgs receive_args = this.ReceiveEventArgsPool.Pop();
            SocketAsyncEventArgs send_args    = this.SendEventArgsPool.Pop();

            receive_args.UserToken = user_token;
            send_args.UserToken    = user_token;


            user_token.OnConnected();

            BeginReceive(client_socket, receive_args, send_args);

            Packet msg           = Packet.Create((short)NetworkDefine.SYS_START_HEARTBEAT);
            var    send_interval = (byte)5;

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

            if (CurrentState == STATE_CLOSED)
            {
                // already closed.
                return;
            }

            CurrentState          = STATE_CLOSED;
            ReserveClosingMillSec = 0;

            Sock.Close();
            Sock = null;

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

            SendingList.Clear();

            RefMsgResolver.ClearBuffer();


            OnSessionClosed(this);

            var msg = Packet.Create((short)NetworkDefine.SYS_NTF_CLOSED);

            Dispatcher.IncomingPacket(true, this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position));
        }
Пример #3
0
        public void OnConnected()
        {
            CurrentState  = STATE_CONNECTED;
            IsClosed      = 0;
            AutoHeartbeat = true;

            var msg = Packet.Create((short)NetworkDefine.SYS_NTF_CONNECTED);

            Dispatcher.IncomingPacket(true, this, new ArraySegment <byte>(msg.Buffer, 0, msg.Position));
        }
Пример #4
0
        void Send()
        {
            var msg = Packet.Create((short)NetworkDefine.SYS_UPDATE_HEARTBEAT);

            Remote.Send(msg);
        }