Example #1
0
        /*
         *  Buffer.BlockCopy(shortSamples, 0, packetBytes, 0, shortSamples.Length * sizeof(short)).
         *      -And the same trick works in reverse as well:
         *  Buffer.BlockCopy(packetBytes, readPosition, shortSamples, 0, payloadLength);
         */

        public static bool UnpackPacket(byte[] buffer, int size,
                                        NetworkChunkConstruct packet)
        {
            if (size < PACKET_HEADER_SIZE_WITHOUT_TOKEN ||
                size > MAX_PACKET_SIZE)
            {
                Debug.Warning("network", $"packet too small, size={size}");
                return(false);
            }

            packet.Flags     = (PacketFlags)(buffer[0] >> 2);
            packet.Ack       = ((buffer[0] & 0x3) << 8) | buffer[1];
            packet.NumChunks = buffer[2];
            packet.DataSize  = size - PACKET_HEADER_SIZE_WITHOUT_TOKEN;
            packet.Token     = 0;

            if (packet.Flags.HasFlag(PacketFlags.CONNLESS))
            {
                if (size < DATA_OFFSET)
                {
                    Debug.Warning("network", $"connection less packet too small, size={size}");
                    return(false);
                }

                packet.Flags     = PacketFlags.CONNLESS;
                packet.Ack       = 0;
                packet.NumChunks = 0;
                packet.DataSize  = size - DATA_OFFSET;
                Buffer.BlockCopy(buffer, DATA_OFFSET, packet.Data, 0, packet.DataSize);
            }
            else
            {
                var dataStart = PACKET_HEADER_SIZE_WITHOUT_TOKEN;
                if (packet.Flags.HasFlag(PacketFlags.TOKEN))
                {
                    if (size < PACKET_HEADER_SIZE)
                    {
                        Debug.Warning("network", $"packet with token too small, {size}");
                        return(false);
                    }

                    dataStart        = PACKET_HEADER_SIZE;
                    packet.DataSize -= 4;
                    packet.Token     = buffer.ToUInt32(3);
                }

                if (packet.Flags.HasFlag(PacketFlags.COMPRESSION))
                {
                    packet.DataSize = _huffman.Decompress(buffer, dataStart, packet.DataSize,
                                                          packet.Data, 0, MAX_PAYLOAD);
                }
                else
                {
                    Buffer.BlockCopy(buffer, dataStart, packet.Data, 0, packet.DataSize);
                }

                /*if (flags.HasFlag(PacketFlags.COMPRESSION))
                 * {
                 *  if (flags.HasFlag(PacketFlags.CONTROL))
                 *      return false;
                 *
                 *  dataSize = _huffman.Decompress(buffer, PACKET_HEADER_SIZE,
                 *      dataSize, packet.Data, 0, MAX_PAYLOAD);
                 * }
                 * else
                 * {
                 *  Buffer.BlockCopy(buffer, PACKET_HEADER_SIZE, packet.Data, 0, dataSize);
                 * }
                 *
                 * packet.Flags = flags;
                 * packet.Ack = ack;
                 * packet.NumChunks = numChunks;
                 * packet.DataSize = dataSize;*/
            }

            if (packet.DataSize < 0)
            {
                Debug.Warning("network", "error during packet decoding");
                return(false);
            }

            return(true);
        }
Example #2
0
        public static bool UnpackPacket(byte[] data, int dataSize,
                                        ChunkConstruct chunkConstruct)
        {
            if (dataSize < PacketHeaderSize || dataSize > MaxPacketSize)
            {
                Debug.Log("network", $"packet size wrong, size={dataSize}");
                return(false);
            }

            chunkConstruct.Flags = (PacketFlags)((data[0] & 0xfc) >> 2);

            if (chunkConstruct.Flags.HasFlag(PacketFlags.Connless))
            {
                if (dataSize < PacketHeaderSizeConnless)
                {
                    Debug.Log("network", $"connless packet too small, size={dataSize}");
                    return(false);
                }

                chunkConstruct.Flags     = PacketFlags.Connless;
                chunkConstruct.Ack       = 0;
                chunkConstruct.NumChunks = 0;

                var version = data[0] & 0x3;
                if (version != PacketVersion)
                {
                    return(false);
                }

                chunkConstruct.DataSize = dataSize - PacketHeaderSizeConnless;
                chunkConstruct.Token    =
                    (uint)((data[1] << 24) |
                           (data[2] << 16) |
                           (data[3] << 8) |
                           (data[4]));
                chunkConstruct.ResponseToken =
                    (uint)((data[5] << 24) |
                           (data[6] << 16) |
                           (data[7] << 8) |
                           (data[8]));

                Buffer.BlockCopy(data, PacketHeaderSizeConnless,
                                 chunkConstruct.Data, 0, chunkConstruct.DataSize);
            }
            else
            {
                if (dataSize - PacketHeaderSize > MaxPayload)
                {
                    Debug.Log("network", $"packet payload too big, size={dataSize}");
                    return(false);
                }

                chunkConstruct.Ack           = ((data[0] & 0x3) << 8) | data[1];
                chunkConstruct.NumChunks     = data[2];
                chunkConstruct.DataSize      = dataSize - PacketHeaderSize;
                chunkConstruct.ResponseToken = TokenHelper.TokenNone;
                chunkConstruct.Token         =
                    (uint)((data[3] << 24) |
                           (data[4] << 16) |
                           (data[5] << 8) |
                           (data[6]));

                if (chunkConstruct.Flags.HasFlag(PacketFlags.Compression))
                {
                    chunkConstruct.DataSize = Huffman.Decompress(data, PacketHeaderSize,
                                                                 chunkConstruct.DataSize, chunkConstruct.Data, 0, chunkConstruct.Data.Length);
                }
                else
                {
                    Buffer.BlockCopy(data, PacketHeaderSize,
                                     chunkConstruct.Data, 0, chunkConstruct.DataSize);
                }
            }

            if (chunkConstruct.DataSize < 0)
            {
                Debug.Log("network", "error during packet decoding");
                return(false);
            }

            if (chunkConstruct.Flags.HasFlag(PacketFlags.Control))
            {
                if (chunkConstruct.DataSize >= 5)
                {
                    if (chunkConstruct.Data[0] == (int)ConnectionMessages.Connect ||
                        chunkConstruct.Data[0] == (int)ConnectionMessages.Token)
                    {
                        chunkConstruct.ResponseToken =
                            (uint)((chunkConstruct.Data[1] << 24) |
                                   (chunkConstruct.Data[2] << 16) |
                                   (chunkConstruct.Data[3] << 8) |
                                   (chunkConstruct.Data[4]));
                    }
                }
            }

            return(true);
        }