public Message(uint type, FragmentedPacket packet, MemberParser parser) : base(packet.Buffer.Memory.Slice(4), 0, parser) { Type = type; this.packet = packet; //Parse(); }
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); }
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); }