public void OnReceive(Gamnet.Buffer buf) { _recv_buff += buf; while (_recv_buff.Size() >= Packet.HEADER_SIZE) { ushort packetLength = BitConverter.ToUInt16(_recv_buff.data, _recv_buff.read_index + Packet.OFFSET_LENGTH); if (packetLength > Gamnet.Buffer.BUFFER_SIZE) { Error(new Gamnet.Exception(ErrorCode.BufferOverflowError, "The packet length is greater than the buffer max length.")); return; } if (packetLength > _recv_buff.Size()) // not enough { return; } uint msgID = BitConverter.ToUInt32(_recv_buff.data, _recv_buff.read_index + Packet.OFFSET_MSGID); if (false == _handlers.ContainsKey(msgID)) { Error(new Gamnet.Exception(ErrorCode.UnhandledMsgError, "can't find registered msg(id:" + msgID + ")")); return; } _recv_buff.read_index += Packet.HEADER_SIZE; _timeout_monitor.UnsetTimeout(msgID); Delegate_OnReceive handler = _handlers[msgID]; try { handler(_recv_buff); } catch (System.Exception e) { Error(new Gamnet.Exception(ErrorCode.UndefinedError, e.Message)); } _recv_buff.read_index += packetLength - Packet.HEADER_SIZE; } }
public override void OnReceive(Gamnet.Buffer buf) { recvBuffer += buf; while (recvBuffer.Size() >= PACKET_HEADER_SIZE) { ushort packetLength = BitConverter.ToUInt16(recvBuffer.data, recvBuffer.readIndex + PACKET_SIZE_OFFSET); if (packetLength > Gamnet.Buffer.BUFFER_SIZE) { throw new Exception(string.Format("The packet length is greater than the buffer max length.")); } if (packetLength > recvBuffer.Size()) { // not enough return; } int msgID = BitConverter.ToInt32(recvBuffer.data, recvBuffer.readIndex + MSGID_OFFSET); if (false == handlers.ContainsKey(msgID)) { ErrorEvent evt = new ErrorEvent(this); evt.exception = new System.Exception("can't find registered msg(id:" + msgID + ")"); eventQueue.Enqueue(evt); return; } recvBuffer.readIndex += PACKET_HEADER_SIZE; Action <Gamnet.Buffer> handler = handlers[msgID]; try { timeoutMonitor.UnsetTimeout(msgID); handler(recvBuffer); } catch (System.Exception) { } } }