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); } } }