PacketParser.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. namespace TNet
  3. {
  4. internal enum ParserState
  5. {
  6. PacketSize,
  7. PacketBody,
  8. }
  9. internal class PacketParser
  10. {
  11. private readonly TBuffer buffer;
  12. private int packetSize;
  13. private readonly byte[] packetSizeBuffer = new byte[4];
  14. private ParserState state;
  15. private byte[] packet;
  16. private bool isOK;
  17. public PacketParser(TBuffer buffer)
  18. {
  19. this.buffer = buffer;
  20. }
  21. public bool Parse()
  22. {
  23. if (this.isOK)
  24. {
  25. return true;
  26. }
  27. bool finish = false;
  28. while (!finish)
  29. {
  30. switch (state)
  31. {
  32. case ParserState.PacketSize:
  33. if (buffer.Count < 4)
  34. {
  35. finish = true;
  36. }
  37. else
  38. {
  39. buffer.RecvFrom(packetSizeBuffer);
  40. packetSize = BitConverter.ToInt32(packetSizeBuffer, 0);
  41. state = ParserState.PacketBody;
  42. }
  43. break;
  44. case ParserState.PacketBody:
  45. if (buffer.Count < packetSize)
  46. {
  47. finish = true;
  48. }
  49. else
  50. {
  51. this.packet = new byte[packetSize];
  52. buffer.RecvFrom(this.packet);
  53. this.isOK = true;
  54. state = ParserState.PacketSize;
  55. finish = true;
  56. }
  57. break;
  58. }
  59. }
  60. return this.isOK;
  61. }
  62. public byte[] GetPacket()
  63. {
  64. byte[] result = packet;
  65. this.isOK = false;
  66. return result;
  67. }
  68. }
  69. }