protected void ProcessPacket(ObjectPacket p) { if (p == null) { return; } OnBeforeProcessPacket(); var packetType = ObjectPacket.GetPacketType(p.PacketId); MethodInfo processMethod; if (!PacketMethods.TryGetValue(packetType, out processMethod)) { processMethod = GetType().GetMethod("Process", new[] { packetType }); PacketMethods[packetType] = processMethod; } if (processMethod == null) { throw new NotImplementedException(string.Format("Not Implemented Exception: Method Process({0}).", packetType)); } _parameterCache[0] = p; processMethod.Invoke(this, _parameterCache); OnAfterProcessPacket(); }
protected override void ReadHandler() { MessageBuffer buffer = GetReadBuffer(); while (buffer.GetActiveSize() > 0) { int size = RecvHeaderSize; if (buffer.GetActiveSize() < size) { break; } // We just received nice new header if (!_NextPacketDecrypted) { _authCrypt.DecryptRecv(buffer.Data(), buffer.Rpos(), size); } _NextPacketDecrypted = false; var addr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer.Data(), buffer.Rpos()); int packetId; bool compressed; if (ServerSocket) { var header = Marshal.PtrToStructure <ClientPacketHeader>(addr); size = header.Size + sizeof(ushort); packetId = header.PacketId; compressed = header.Compressed != 0; } else { var header = Marshal.PtrToStructure <ServerPacketHeader>(addr); size = header.Size + sizeof(int); packetId = header.PacketId; compressed = header.Compressed != 0; } var packetType = ObjectPacket.GetPacketType(packetId); if (packetType == null || size <= 0 || size >= _MaxPacketSize) { if (LogException) { var message = string.Format("Client {0} sent malformed packet (size: {1}, packetId: {2}).", RemoteAddress, size, packetId); if (NetSettings.Logger != null) { NetSettings.Logger.Warn(message); } else { Console.WriteLine(message); } } if (CloseOnMalformedPacket) { CloseSocket(); return; } else { // Buffer are corrupted, reset! buffer.Reset(); continue; } } if (buffer.GetActiveSize() < size) { // NOTE: The header buffer of next upcoming packet is already decrypted in above code. // We must skip _authCrypt.DecryptRecv() for next packet. _NextPacketDecrypted = true; break; } buffer.ReadCompleted(RecvHeaderSize); size -= RecvHeaderSize; DeserializePacket(packetType, compressed, size, buffer); } AsyncRead(); }