//---------------------------------------------------------------------------------------------------- /// <summary> /// 데이터 수신 처리 /// </summary> /// <param name="client">cClient 인스턴스</param> /// <param name="data">수신 데이터</param> /// <param name="size">수신 데이터 크기</param> //---------------------------------------------------------------------------------------------------- void OnRecv( cClient client, byte[] data, int size ) { if( client.UseCryptogram ) data = cCryptogram.Decrypt( data, size, client.DataIV, client.DataKey ); cBitStream bits = new cBitStream(); bits.Write( data, 0, size ); bits.Position = 0; cNetwork.eOrder order = cNetwork.ReadOrder( bits ); cNetwork.eResult result = cNetwork.ReadResult( bits ); if( result != cNetwork.eResult.SUCCESS ) { Error( order + " : " + result + " : \n" + bits.ToString() ); } else { Print( order + " : " + result + " : \n" + bits.ToString() ); } switch( order ) { case cNetwork.eOrder.SERVER_LOGIN: RecvServerLogin( result, bits ); break; case cNetwork.eOrder.SERVER_IN: RecvServerIn( result, bits ); break; case cNetwork.eOrder.SERVER_OUT: RecvServerOut( result, bits ); break; case cNetwork.eOrder.CLIENT_INFO_DEFAULT: RecvClientInfoDefault( result, bits ); break; case cNetwork.eOrder.CHANNEL_LIST: RecvChannelList( result, bits ); break; case cNetwork.eOrder.CHANNEL_IN: RecvChannelIn( result, bits ); break; case cNetwork.eOrder.CHANNEL_OUT: RecvChannelOut( result, bits ); break; case cNetwork.eOrder.CHANNEL_CHAT: RecvChannelChat( result, bits ); break; case cNetwork.eOrder.PARTY_CHAT: RecvPartyChat( result, bits ); break; case cNetwork.eOrder.STAGE_LIST: RecvStageList( result, bits ); break; case cNetwork.eOrder.STAGE_IN_REQUEST: RecvStageInRequest( result, bits ); break; case cNetwork.eOrder.STAGE_IN_ACCEPT: RecvStageInAccept( result, bits ); break; case cNetwork.eOrder.STAGE_USER_IN: RecvStageUserIn( result, bits ); break; case cNetwork.eOrder.STAGE_USER_OUT: RecvStageUserOut( result, bits ); break; case cNetwork.eOrder.STAGE_USER_MOVE: RecvStageUserMove( result, bits ); break; case cNetwork.eOrder.STAGE_USER_ATTACK_MONSTER: RecvStageUserAttackMonster( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_SELF: RecvStageUserSkillSelf( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_MONSTER: RecvStageUserSkillMonster( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_POS: RecvStageUserSkillPos( result, bits ); break; case cNetwork.eOrder.STAGE_USER_DAMAGE: RecvStageUserDemage( result, bits ); break; case cNetwork.eOrder.STAGE_USER_ITEM_USE_SELF: RecvStageUserItemUseSelf( result, bits ); break; case cNetwork.eOrder.STAGE_USER_TRIGGER_ON: RecvStageUserTriggerOn( result, bits ); break; case cNetwork.eOrder.STAGE_MON_IN: RecvStageMonIn( result, bits ); break; case cNetwork.eOrder.STAGE_MON_MOVE: RecvStageMonMove( result, bits ); break; case cNetwork.eOrder.STAGE_MON_ATTACK_USER: RecvStageMonAttackUser( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_SELF: RecvStageMonSkillSelf( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_ACTOR: RecvStageMonSkillUser( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_POS: RecvStageMonSkillPos( result, bits ); break; case cNetwork.eOrder.STAGE_MON_DAMAGE: RecvStageMonDemage( result, bits ); break; case cNetwork.eOrder.STAGE_DATA: RecvStageData( result, bits ); break; default: client.Disconnect(); break; } }
//---------------------------------------------------------------------------------------------------- /// <summary> /// 수신된 데이터를 파싱한다. /// 주의 : 이 함수는 상속 받아서 클라이언트마다 각자 프로토콜을 정의해서 사용한다. /// </summary> /// <param name="client">수신 클라이언트</param> /// <param name="data">수신 데이터</param> /// <param name="size">수신 데이터 크기</param> //---------------------------------------------------------------------------------------------------- protected virtual void OnRecv( cClient client, byte[] data, int size ) { cBitStream bits = new cBitStream(); bits.Write( data, 0, size ); Print( bits.ToString() ); eOrder order = ReadOrder( bits ); eResult result = ReadResult( bits ); Print( order + " : '"+client.Name+"'" ); // 파싱 switch( order ) { case eOrder.OBJECT_UPDATE: RecvObjectUpdate( client, result, bits ); break; default: Error( client.Name + ":" + order ); break; } }