| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- using System;
- namespace TNet
- {
- internal enum ParserState
- {
- PacketSize,
- PacketBody,
- }
- internal class PacketParser
- {
- private readonly TBuffer buffer;
- private int packetSize;
- private readonly byte[] packetSizeBuffer = new byte[4];
- private ParserState state;
- private byte[] packet;
- private bool isOK;
- public PacketParser(TBuffer buffer)
- {
- this.buffer = buffer;
- }
- public bool Parse()
- {
- if (this.isOK)
- {
- return true;
- }
- bool finish = false;
- while (!finish)
- {
- switch (state)
- {
- case ParserState.PacketSize:
- if (buffer.Count < 4)
- {
- finish = true;
- }
- else
- {
- buffer.RecvFrom(packetSizeBuffer);
- packetSize = BitConverter.ToInt32(packetSizeBuffer, 0);
- state = ParserState.PacketBody;
- }
- break;
- case ParserState.PacketBody:
- if (buffer.Count < packetSize)
- {
- finish = true;
- }
- else
- {
- this.packet = new byte[packetSize];
- buffer.RecvFrom(this.packet);
- this.isOK = true;
- state = ParserState.PacketSize;
- finish = true;
- }
- break;
- }
- }
- return this.isOK;
- }
- public byte[] GetPacket()
- {
- byte[] result = packet;
- this.isOK = false;
- return result;
- }
- }
- }
|