Example #1
0
        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?
            }
        }