public CruMessage ExtractDatas(CruNetworkProtocol.MSG_TYPE type, byte[] buffer, int offset, int buffersize) { CruMessage result; object[] datas; int[] datasizelist; CruNetworkProtocol.DATA_TYPE[] typelist; int bufferIdx = 0; int setDataSize = 0; datasizelist = CruNetworkProtocol.GetMessageSizeList(type); typelist = CruNetworkProtocol.GetMessageTypeList(type); datas = new object[datasizelist.Length - 1]; for (int i = 1; i < datasizelist.Length; ++i) { setDataSize = offset + bufferIdx; // 다음에 처리할 사이즈가 총 버퍼의 사이즈를 넘어간다면, if (setDataSize + datasizelist[i] > buffersize) { throw new SystemException("버퍼 사이즈를 넘겼습니다."); } // 데이터 Get switch (typelist[i]) { case CruNetworkProtocol.DATA_TYPE.BOOLEAN: datas[i - 1] = BitConverter.ToBoolean(buffer, setDataSize); break; case CruNetworkProtocol.DATA_TYPE.SHORT: datas[i - 1] = BitConverter.ToInt16(buffer, setDataSize); break; case CruNetworkProtocol.DATA_TYPE.INT: datas[i - 1] = BitConverter.ToInt32(buffer, setDataSize); break; case CruNetworkProtocol.DATA_TYPE.FLOAT: datas[i - 1] = BitConverter.ToSingle(buffer, setDataSize); break; case CruNetworkProtocol.DATA_TYPE.DOUBLE: datas[i - 1] = BitConverter.ToDouble(buffer, setDataSize); break; // string어디까지 읽을건지가 안적혀있구나... 이거... 그냥 앞에 데이터타입을 붙여야하나? case CruNetworkProtocol.DATA_TYPE.STRING: { int stringsize = BitConverter.ToInt16(buffer, setDataSize); datas[i - 1] = Encoding.ASCII.GetString(buffer, bufferIdx + CruNetworkProtocol.Head.HEADSIZE_STRING, stringsize); } break; default: break; } setDataSize += datasizelist[i]; } // 변화한 데이터 사이즈가, 총량을 넘어갔을 때 ㅇㅇ if (setDataSize > datasizelist[0]) { return(null); } result = new CruMessage(type, datas); return(result); }
public CruMessage(CruNetworkProtocol.MSG_TYPE type, object[] datas) { _type = (short)type; _datas = datas; }
// bool 형으로 만들어서 제대로 처리되었는지 확인해야할까...? public void MessageHandle(CruMessage msg, int clientNum) { CruNetworkProtocol.MSG_TYPE type = (CruNetworkProtocol.MSG_TYPE)msg.Type; switch (type) { case CruNetworkProtocol.MSG_TYPE.LOGIN_REQUEST: onLoginRequestEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.LOGIN_ACK: onLoginACKEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.CHECK_USER: onCheckUserEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.CHECK_USER_ACK: onCheckUserACKEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.PLAYER_DATA: onPlayerDataEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.CUSTOM_PLAYER_DATA: onCustomPlayerDataEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.PLAYER_LOCATION: onPlayerLocation(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.ITEM_DATA: onItemDataEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.MOVE: onMoveEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.LOOK: onLookEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.ITEM_BUY: onItemBuyEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.REQUEST_PLAYERS_LOCATION: onRequestPlayersLocation(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.RESULT_GETEXP: onResultGetEXPEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.RESULT_LEVELUP: onResultLevelUpEvent(msg, clientNum); break; case CruNetworkProtocol.MSG_TYPE.RESULT_ATTACK: onResultAttackEvent(msg, clientNum); break; default: throw new SystemException("해당 명령이 존재하지 않습니다."); } }