Beispiel #1
0
        List <byte[]> SplitPacketBuffer(byte[] dataBuffer)
        {
            List <byte[]> list      = new List <byte[]>();
            int           headerPos = 0;

            for (; ;)
            {
                if (pos <= headerPos + Marshal.SizeOf(typeof(EnvPacketHeader)))
                {
                    break;
                }
                headerPos = FindHeader();
                if (-1 == headerPos)
                {
                    Array.Copy(dataBuffer, pos - Marshal.SizeOf(typeof(EnvPacketHeader)), dataBuffer, 0, Marshal.SizeOf(typeof(EnvPacketHeader)));
                    pos = Marshal.SizeOf(typeof(EnvPacketHeader));
                    break;
                }

                EnvPacketHeader header    = Tool.ByteToStruct <EnvPacketHeader>(dataBuffer, headerPos, Marshal.SizeOf(typeof(EnvPacketHeader)));
                int             packetLen = 0;
                switch ((EnvProtocol.DataType)header.dataType)
                {
                case EnvProtocol.DataType.DataTypeSlow:
                    packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(SlowPacket));
                    break;

                case EnvProtocol.DataType.DataTypeFast:
                    packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(FastPacket));
                    break;

                case EnvProtocol.DataType.DataTypeTail:
                    packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(TailPacketUdp));
                    break;

                default:
                    break;
                }
                if (packetLen != 0 && headerPos + packetLen <= pos)
                {
                    byte[] protocolData = new byte[packetLen];
                    Array.Copy(dataBuffer, headerPos, protocolData, 0, packetLen);
                    int contentHeaderPos = FindHeader(protocolData.Skip(Marshal.SizeOf(typeof(EnvPacketHeader))).ToArray());
                    if (contentHeaderPos == -1)
                    {
                        list.Add(protocolData);
                        Array.Copy(dataBuffer, headerPos + packetLen, dataBuffer, 0, pos - headerPos - packetLen);
                        pos      -= (headerPos + packetLen);
                        headerPos = 0;
                    }
                    else
                    {
                        Array.Copy(dataBuffer, headerPos + contentHeaderPos, dataBuffer, 0, pos - headerPos - contentHeaderPos);
                        pos      -= (headerPos + contentHeaderPos);
                        headerPos = 0;
                    }
                }
                else
                {
                    break;
                }
            }
            return(list);
        }
Beispiel #2
0
        private void ParseData(byte[] buffer)
        {
            if (buffer.Length <= Marshal.SizeOf(typeof(EnvPacketHeader)))
            {
                return;
            }
            EnvPacketHeader header = Tool.ByteToStruct <EnvPacketHeader>(buffer, 0, Marshal.SizeOf(typeof(EnvPacketHeader)));

            if (!Enumerable.SequenceEqual(header.syncHeader, EnvProtocol.SyncHeader))
            {
                return;
            }
            byte[] body = new byte[buffer.Length - Marshal.SizeOf(typeof(EnvPacketHeader))];
            Array.Copy(buffer, Marshal.SizeOf(typeof(EnvPacketHeader)), body, 0, body.Length);
            switch ((EnvProtocol.DataType)header.dataType)
            {
            case EnvProtocol.DataType.DataTypeSlow:
                SlowPacket slowPacket;
                if (SlowParser.Parse(body, out slowPacket))
                {
                    IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SlowPacket)));
                    Marshal.StructureToPtr(slowPacket, ptr, true);
                    WinApi.PostMessage(mainWindowHandle, WinApi.WM_SLOW_DATA, 0, ptr);
                }
                else
                {
                    WinApi.PostMessage(mainWindowHandle, WinApi.WM_SLOW_DATA, 0, IntPtr.Zero);
                }
                if (IsStartLogData)
                {
                    dataLogger.WriteSlowPacket(buffer);
                }
                break;

            case EnvProtocol.DataType.DataTypeFast:
                FastPacket fastPacket;
                if (FastParser.Parse(body, out fastPacket))
                {
                    IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FastPacket)));
                    Marshal.StructureToPtr(fastPacket, ptr, true);
                    WinApi.PostMessage(mainWindowHandle, WinApi.WM_FAST_DATA, 0, ptr);
                }
                else
                {
                    WinApi.PostMessage(mainWindowHandle, WinApi.WM_FAST_DATA, 0, IntPtr.Zero);
                }
                if (IsStartLogData)
                {
                    dataLogger.WriteFastPacket(buffer);
                }
                break;

            case EnvProtocol.DataType.DataTypeTail:
                List <TailPacketRs> tailPacketRs = tailParser.Parse(body);
                if (tailPacketRs.Count > 0)
                {
                    foreach (TailPacketRs packet in tailPacketRs)
                    {
                        IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TailPacketRs)));
                        Marshal.StructureToPtr(packet, ptr, true);
                        WinApi.PostMessage(mainWindowHandle, WinApi.WM_TAIL_DATA, 0, ptr);
                    }
                }
                else
                {
                    WinApi.PostMessage(mainWindowHandle, WinApi.WM_TAIL_DATA, 0, IntPtr.Zero);
                }
                if (IsStartLogData)
                {
                    dataLogger.WriteTailPacket(buffer);
                }
                break;

            default:
                break;
            }
        }