Пример #1
0
        public void on_message(CPacket msg)
        {
            // active close를 위한 코딩.
            //   서버에서 종료하라고 연락이 왔는지 체크한다.
            //   만약 종료신호가 맞다면 disconnect를 호출하여 받은쪽에서 먼저 종료 요청을 보낸다.
            switch (msg.protocol_id)
            {
            case SYS_CLOSE_REQ:
                disconnect();
                return;

            case SYS_START_HEARTBEAT:
            {
                // 순서대로 파싱해야 하므로 프로토콜 아이디는 버린다.
                msg.pop_protocol_id();
                // 전송 인터벌.
                byte interval = msg.pop_byte();
                this.heartbeat_sender = new CHeartbeatSender(this, interval);

                if (this.auto_heartbeat)
                {
                    start_heartbeat();
                }
            }
                return;

            case SYS_UPDATE_HEARTBEAT:
                //Console.WriteLine("heartbeat : " + DateTime.Now);
                this.latest_heartbeat_time = DateTime.Now.Ticks;
                return;
            }


            if (this.peer != null)
            {
                try
                {
                    switch (msg.protocol_id)
                    {
                    case SYS_CLOSE_ACK:
                        this.peer.on_removed();
                        break;

                    default:
                        this.peer.on_message(msg);
                        break;
                    }
                }
                catch (Exception)
                {
                    close();
                }
            }

            if (msg.protocol_id == SYS_CLOSE_ACK)
            {
                if (this.on_session_closed != null)
                {
                    this.on_session_closed(this);
                }
            }
        }