public void RegisterHandler(uint msg_id, Delegate_OnReceive handler) { if (_handlers.ContainsKey(msg_id)) { _handlers[msg_id] += handler; } else { _handlers.Add(msg_id, handler); } }
public void UnregisterHandler(uint msg_id, Delegate_OnReceive handler) { if (_handlers.ContainsKey(msg_id)) { _handlers[msg_id] -= handler; if (null == _handlers[msg_id]) { _handlers.Remove(msg_id); } } }
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; } }