PacketParser.cs 1.4 KB

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