示例#1
0
        private void Parse()
        {
            if (this.isOK)
            {
                return;
            }

            bool finish = false;

            while (!finish)
            {
                switch (this.state)
                {
                case ParserState.PacketSize:
                    if (this.buffer.Count < 2)
                    {
                        finish = true;
                    }
                    else
                    {
                        this.buffer.RecvFrom(this.packetSizeBuffer);
                        this.packetSize = BitConverter.ToUInt16(this.packetSizeBuffer, 0);
                        this.packetSize = NetworkHelper.NetworkToHostOrder(this.packetSize);
                        if (packetSize > 60000)
                        {
                            throw new Exception($"packet too large, size: {this.packetSize}");
                        }
                        this.state = ParserState.PacketBody;
                    }
                    break;

                case ParserState.PacketBody:
                    if (this.buffer.Count < this.packetSize)
                    {
                        finish = true;
                    }
                    else
                    {
                        this.packet = new byte[this.packetSize];
                        this.buffer.RecvFrom(this.packet);
                        this.isOK  = true;
                        this.state = ParserState.PacketSize;
                        finish     = true;
                    }
                    break;
                }
            }
        }
示例#2
0
        private async void StartRecv()
        {
            while (true)
            {
                if (this.Id == 0)
                {
                    return;
                }

                byte[] messageBytes;
                try
                {
                    messageBytes = await channel.Recv();

                    if (this.Id == 0)
                    {
                        return;
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                    continue;
                }

                if (messageBytes.Length < 3)
                {
                    continue;
                }

                ushort opcode = BitConverter.ToUInt16(messageBytes, 0);
                opcode = NetworkHelper.NetworkToHostOrder(opcode);
                try
                {
                    this.Run(opcode, messageBytes);
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }
            }
        }