public void Process(CancellationToken ct) { while (outgoingPackets.TryDequeue(out Memory <byte> p)) { var t = new Memory <byte>(new byte[4 + p.Length]); p.CopyTo(t.Slice(4)); Utils.WriteStruct(Utils.SimpleFixEndianess(client.SocketID)).CopyTo(t); _ = sender.Send(t, client.RemoteEndpoint); LastActivity = DateTime.Now; } while (incomingPackets.TryDequeue(out var packet)) { //Console.Write("> " + string.Concat(BitConverter.GetBytes(packet.Header.PacketHeader).ToArray().Select(b => b.ToString("X2")).ToArray())); //Console.WriteLine(" "+string.Concat(packet.PacketData.ToArray().Select(b => b.ToString("X2")).ToArray())); ushort seqNum = 0; if (IsSequenced) { seqNum = Utils.SimpleFixEndianess(packet.Read <ushort>()); // TODO: Implement SequencedPacketQueue } if (packet.Header.ResendCount > 0) { // de-xor data int x = packet.PacketData.Length >> 3; var data = packet.PacketData.ToArray(); if (x > 0) { Span <ulong> uSpan = System.Runtime.InteropServices.MemoryMarshal.Cast <byte, ulong>(data); for (int i = 0; i < x; i++) { uSpan[i] ^= xorULong[packet.Header.ResendCount]; } data = System.Runtime.InteropServices.MemoryMarshal.Cast <ulong, byte>(uSpan).ToArray(); } for (int i = x * 8; i < data.Length; i++) { data[i] ^= xorByte[packet.Header.ResendCount]; } //for( int i = 0; i < data.Length; i++ ) // data[i] ^= xorByte[packet.Header.ResendCount]; packet = new GamePacket(packet.Header, new ReadOnlyMemory <byte>(data)); Program.Logger.Fatal("---> Received Resent packet!!! C:{0}: {1} bytes", Type, packet.TotalBytes); } if (packet.Header.IsSplit) { Program.Logger.Fatal("---> Received Split packet!!! C:{0}: {1} bytes", Type, packet.TotalBytes); } if (IsReliable && (seqNum > LastAck || (seqNum < 0xff && LastAck > 0xff00))) { client.SendAck(Type, seqNum, packet.Recieved); LastAck = seqNum; } PacketAvailable?.Invoke(packet); LastActivity = DateTime.Now; } if ((DateTime.Now - LastActivity).TotalMilliseconds > 100) { // Send heartbeat? } }