Beispiel #1
0
        private static void ParseBuffer(RecvState state, int dataLength)
        {
            if (dataLength == 0)
            {
                return;
            }
            byte[] workingBuf;
            if (state.m_PrevLeftoverBuf != null)
            {
                workingBuf = new byte[dataLength + state.m_PrevLeftoverBuf.Length];
                Buffer.BlockCopy(state.m_PrevLeftoverBuf, 0, workingBuf, 0, state.m_PrevLeftoverBuf.Length);
                Buffer.BlockCopy(state.m_buf, 0, workingBuf, state.m_PrevLeftoverBuf.Length, dataLength);
                state.m_PrevLeftoverBuf = null;
                dataLength = workingBuf.Length;
            }
            else
            {
                workingBuf = state.m_buf;
            }

            int expectedTotalPacketLen = 0;
            int packetLenBytes         = 0;

            for (int i = 0; i < dataLength;)
            {
                /********************************************************************/
                // Read packet length
                /********************************************************************/
                packetLenBytes         = 1;
                state.m_bytesLenBuf    = 1;
                expectedTotalPacketLen = workingBuf[i] & 0x7F;
                while ((workingBuf[i] & 0x80) == 0x80)
                {
                    i++;
                    if (i < dataLength)
                    {
                        expectedTotalPacketLen <<= 7;
                        expectedTotalPacketLen  += workingBuf[i] & 0x7F;
                        packetLenBytes++;
                        state.m_bytesLenBuf = packetLenBytes;
                    }
                    else
                    {
                        state.m_PrevLeftoverBuf = new byte[packetLenBytes];
                        Buffer.BlockCopy(workingBuf, i - packetLenBytes, state.m_PrevLeftoverBuf, 0, packetLenBytes);
                        StartRecvPacket(state);
                        return;
                    }
                }
                /********************************************************************/
                // End Read packet length
                /********************************************************************/
                i++;
                int packetBytesRecived = Math.Min(expectedTotalPacketLen, dataLength - i);
                if (packetBytesRecived < expectedTotalPacketLen)
                {
                    state.m_PrevLeftoverBuf = new byte[packetBytesRecived + packetLenBytes];
                    Array.Copy(workingBuf, i - packetLenBytes, state.m_PrevLeftoverBuf, 0, packetBytesRecived + packetLenBytes);
                    if (!state.m_recvLoop)
                    {
                        state.m_buf = new byte[expectedTotalPacketLen - packetBytesRecived];
                    }
                    state.m_OnRecvProgress?.Invoke(packetBytesRecived, expectedTotalPacketLen);
                    StartRecvPacket(state);

                    return;
                }

                byte[] data = new byte[packetBytesRecived];
                Array.Copy(workingBuf, i, data, 0, packetBytesRecived);
                state.m_OnRecv(data, data.Length + state.m_bytesLenBuf);
                i += packetBytesRecived;
            }
            if (state.m_recvLoop)
            {
                StartRecvPacket(state);
            }
        }