internal ServerPacket RecieveSinglePacketIfAvailable(PacketBuffer pBuffer) { if (pBuffer.Length <= 0) { return(null); } ServerPacketId packetid = (ServerPacketId)pBuffer[0]; ServerPacketInfo info; if (!_registry.TryGetValue(packetid, out info)) { InvokeOnUnknownPacket(string.Format("Invalid packet {0}, clearing buffer.", packetid), pBuffer.buffer); pBuffer.ClearIncoming(); } else { ushort packetlen; if (!info.isFixedLen) { if (pBuffer.Length < 3) { return(null); } packetlen = (ushort)(pBuffer[1] << 8 | pBuffer[2]); } else { packetlen = info.FixedLength; } if (pBuffer.Length >= packetlen) { ServerPacket packet = null; if (info.Factory != null) { packet = info.Factory(new PacketReader(Version, pBuffer, packetlen)); } pBuffer.RemoveBufferHead(packetlen); return(packet); } } return(null); }
void ReadStream(NetworkStream stream) { if (stream.DataAvailable && stream.CanRead) { try { Reader.Read(stream); } catch (System.IO.IOException) { Disconnect(); } catch (Network.BufferOverflowException ex) { if (OnReadBufferOverflow != null) { OnReadBufferOverflow(ex.Message + ": clearing buffer"); } Reader.ClearIncoming(); } } }