private void HandleQueuedPackets() { try { while (!CancellationToken.IsCancellationRequested) { var temp = HandlePacketQueue.Take(CancellationToken.Token); if (CancellationToken.IsCancellationRequested) { return; } try { var packet = temp.Packet; packet.Decode(new MinecraftStream(new MemoryStream(temp.Buffer))); HandlePacket(packet); } catch (Exception e) { Log.Warn($"Exception when handling packet: " + e, e); } } } catch (OperationCanceledException) { } }
private void ProcessNetwork() { int lastPacketId = 0; try { using (NetworkStream ns = new NetworkStream(Socket)) { using (MinecraftStream ms = new MinecraftStream(ns)) { _readerStream = ms; while (!CancellationToken.IsCancellationRequested) { Packets.Packet packet = null; int packetId; byte[] packetData; if (!CompressionEnabled) { int length = ms.ReadVarInt(); int packetIdLength; packetId = ms.ReadVarInt(out packetIdLength); lastPacketId = packetId; if (length - packetIdLength > 0) { /*packetData = new byte[length - packetIdLength]; * int read = 0; * while (read < packetData.Length) * { * read += ms.Read(packetData, read, packetData.Length - read); * * if (CancellationToken.IsCancellationRequested) throw new OperationCanceledException(); * }*/ packetData = ms.Read(length - packetIdLength); } else { packetData = new byte[0]; } } else { int packetLength = ms.ReadVarInt(); int br; int dataLength = ms.ReadVarInt(out br); int readMore; if (dataLength == 0) { packetId = ms.ReadVarInt(out readMore); lastPacketId = packetId; packetData = ms.Read(packetLength - (br + readMore)); } else { byte[] data = ms.Read(packetLength - br); byte[] decompressed; DecompressData(data, out decompressed); using (MemoryStream b = new MemoryStream(decompressed)) { using (MinecraftStream a = new MinecraftStream(b)) { int l; packetId = a.ReadVarInt(out l); lastPacketId = packetId; packetData = a.Read(dataLength - l); } } } } packet = MCPacketFactory.GetPacket(Direction, ConnectionState, packetId); if (packet == null) { if (UnhandledPacketsFilter[ConnectionState] .TryAdd(packetId, 1)) { Log.Debug($"Unhandled packet in {ConnectionState}! 0x{packetId.ToString("x2")} = {(ConnectionState == ConnectionState.Play ? MCPacketFactory.GetPlayPacketName(packetId) : "Unknown")}"); } else { UnhandledPacketsFilter[ConnectionState][packetId] = UnhandledPacketsFilter[ConnectionState][packetId] + 1; } continue; } if (ConnectionState == ConnectionState.Play) { HandlePacketQueue.Add(new TemporaryPacketData(packet, packetData)); } else { packet.Decode(new MinecraftStream(new MemoryStream(packetData))); HandlePacket(packet); } } } } } catch (Exception ex) { if (ex is OperationCanceledException) { return; } if (ex is EndOfStreamException) { return; } if (ex is IOException) { return; } if (LogExceptions) { Log.Warn($"Failed to process network (Last packet: 0x{lastPacketId:X2} State: {ConnectionState}): " + ex); } } finally { Disconnected(false); } }