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; } } }
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()); } } }