Ejemplo n.º 1
0
        public void AcceptPackets()
        {
            List <byte> RxBuffer = new List <byte>();

            while (_mClient.Connected)
            {
                try
                {
                    // TODO: This is really really messy.
                    byte[] rxbuf     = new byte[256 * 1024];
                    int    available = _mStream.Read(rxbuf, 0, 256 * 1024);
                    byte[] rxbuf2    = new byte[available];
                    Array.Copy(rxbuf, rxbuf2, available);
                    RxBuffer.AddRange(rxbuf2);

                    while (RxBuffer.Count >= 6)
                    {
                        if (RxBuffer.Count > 2 * 1024 * 1024)                          // Cap buffer at 2MiB
                        {
                            RxBuffer.RemoveRange(0, RxBuffer.Count - 2 * 1024 * 1024); // remove x bytes so 2 MiB remains.
                        }
                        try
                        {
                            if (RxBuffer[0] == (byte)'$' && RxBuffer[1] == (byte)'#')   /// 0x24 + 0x23
                            {
                                int size = BitConverter.ToInt32(RxBuffer.ToArray(), 2);
                                if (RxBuffer.Count > size)
                                {
                                    RxBuffer.RemoveRange(0, 6);

                                    NetworkPacket pack =
                                        (NetworkPacket)ByteMethods.DeserializeFromBytes(RxBuffer.ToArray());
                                    if (Packet != null)
                                    {
                                        Packet(pack);
                                    }

                                    RxBuffer.RemoveRange(0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                        }
                        int next = RxBuffer.IndexOf((byte)'$');
                        if (next >= 2)
                        {
                            RxBuffer.RemoveRange(0, next - 1);
                        }
                    }
                }
                catch (Exception ex)
                {
                }
                Thread.Sleep(5);
            }
        }
Ejemplo n.º 2
0
        private void Listener_Packet(object sender)
        {
            NetworkPacket packet = (NetworkPacket)sender;

            // TODO: Make two fields instead.
            int          lsb  = ((ushort)packet.Type) & 0xFF;
            NetworkTypes type = (NetworkTypes)((ushort)packet.Type & 0xFF00);

            switch (type)
            {
            case NetworkTypes.SIMULATOR:
                NetworkStateReport report = (NetworkStateReport)ByteMethods.DeserializeFromBytes(packet.Data);

                switch (report.State)
                {
                case NetworkAppState.RUNNING:
                    Attached     = true;
                    _name        = report.SimRunning;
                    _processname = report.ProcessRunning;
                    break;

                case NetworkAppState.WAITING_SIM:
                    Attached = false;
                    break;

                case NetworkAppState.WAITING_SESSION:
                    Attached     = true;
                    _name        = report.SimRunning;
                    _processname = report.ProcessRunning;
                    break;
                }

                break;

            case NetworkTypes.DRIVER:
                Drivers = (IDriverCollection)ByteMethods.DeserializeFromBytes(packet.Data);
                break;

            case NetworkTypes.PLAYER:
                Player = (IDriverPlayer)ByteMethods.DeserializeFromBytes(packet.Data);
                break;

            case NetworkTypes.SESSION:
                Session = (ISession)ByteMethods.DeserializeFromBytes(packet.Data);
                break;

            case NetworkTypes.HEADER:
                break;

            case NetworkTypes.TRACKMAP:
                Telemetry.m.NetworkTrack_LoadRoute((RouteCollection)ByteMethods.DeserializeFromBytes(packet.Data));
                break;

            case NetworkTypes.TRACK:
                Telemetry.m.NetworkTrack_LoadInfo(
                    (NetworkTrackInformation)ByteMethods.DeserializeFromBytes(packet.Data));
                break;

                // Others.. do later
            }
        }