Exemple #1
0
 public Message(uint type, FragmentedPacket packet, MemberParser parser)
     : base(packet.Buffer.Memory.Slice(4), 0, parser)
 {
     Type        = type;
     this.packet = packet;
     //Parse();
 }
Exemple #2
0
        private FragmentedPacket[] SplitPacketIntoFragments()
        {
            int normalHeaderSize     = (CRC_SIZE + SEQUENCE_SIZE) / 8;
            int fragmentedHeaderSize = normalHeaderSize +                                                                  // CRC + Sequence
                                       (int)Math.Ceiling((decimal)(FrameSerializer.BitsRequired(0, dFactory.Count() - 1) + // Number of bits required to send the packet type.
                                                                   FragmentedPacket.FRAGMENT_HEADER_SIZE) / 8);            // Fragment ID + Number of fragments
            int         dataSize          = MTU - fragmentedHeaderSize;
            int         nbOfFragments     = (int)Math.Ceiling((FrameSerializer.BitPacking.ByteLength - normalHeaderSize) / (decimal)dataSize);
            Span <byte> data              = FrameSerializer.BitPacking.GetByteSpanBuffer();
            Span <byte> dataWithoutHeader = data.Slice(normalHeaderSize);

            FragmentedPacket[] packets = new FragmentedPacket[nbOfFragments];
            for (int i = 0; i < nbOfFragments; i++)
            {
                FrameSerializer.BitPacking = new BitPacker();
                packets[i]        = new FragmentedPacket();
                packets[i].Header = new PacketHeader(0, CurrentSequence);
                packets[i].Header.BeginSerialize(FrameSerializer);                      // CRC + Sequence
                int id = dFactory.GetID <IPacket>(packets[i]);
                FrameSerializer.Serialize(ref id, 0, dFactory.Count() - 1);             // Packet ID
                packets[i].FragmentID        = i;
                packets[i].NumberOfFragments = nbOfFragments;

                int length = dataSize;
                if (i == nbOfFragments - 1)
                {
                    length = dataWithoutHeader.Length % dataSize;
                }

                packets[i].Data = dataWithoutHeader.Slice(dataSize * i, length).ToArray();
                packets[i].Serialize(FrameSerializer);                                  // Data
                AddCrcOnHeader(packets[i].Header);
            }
            return(packets);
        }
Exemple #3
0
        public static Message Parse(FragmentedPacket packet, MessageDirection direction)
        {
            MemberParser parser = null;
            int          pos    = 0;
            uint         type   = packet.Buffer.Memory.Read <uint>(ref pos);

            if (direction == MessageDirection.Inbound)
            {
                incomingParsers.TryGetValue(type, out parser);
            }
            else
            {
                outgoingParsers.TryGetValue(type, out parser);
            }

            Message msg = new Message(type, packet, parser);

            return(msg);
        }