PacketParser.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.IO;
  3. namespace ET
  4. {
  5. public enum ParserState
  6. {
  7. PacketSize,
  8. PacketBody
  9. }
  10. public class PacketParser
  11. {
  12. private readonly CircularBuffer buffer;
  13. private int packetSize;
  14. private ParserState state;
  15. public AService service;
  16. private readonly byte[] cache = new byte[8];
  17. public const int InnerPacketSizeLength = 4;
  18. public const int OuterPacketSizeLength = 2;
  19. public MemoryStream MemoryStream;
  20. public PacketParser(CircularBuffer buffer, AService service)
  21. {
  22. this.buffer = buffer;
  23. this.service = service;
  24. }
  25. public bool Parse()
  26. {
  27. while (true)
  28. {
  29. switch (this.state)
  30. {
  31. case ParserState.PacketSize:
  32. {
  33. if (this.service.ServiceType == ServiceType.Inner)
  34. {
  35. if (this.buffer.Length < InnerPacketSizeLength)
  36. {
  37. return false;
  38. }
  39. this.buffer.Read(this.cache, 0, InnerPacketSizeLength);
  40. this.packetSize = BitConverter.ToInt32(this.cache, 0);
  41. if (this.packetSize > ushort.MaxValue * 16 || this.packetSize < Packet.MinPacketSize)
  42. {
  43. throw new Exception($"recv packet size error, 可能是外网探测端口: {this.packetSize}");
  44. }
  45. }
  46. else
  47. {
  48. if (this.buffer.Length < OuterPacketSizeLength)
  49. {
  50. return false;
  51. }
  52. this.buffer.Read(this.cache, 0, OuterPacketSizeLength);
  53. this.packetSize = BitConverter.ToUInt16(this.cache, 0);
  54. if (this.packetSize < Packet.MinPacketSize)
  55. {
  56. throw new Exception($"recv packet size error, 可能是外网探测端口: {this.packetSize}");
  57. }
  58. }
  59. this.state = ParserState.PacketBody;
  60. break;
  61. }
  62. case ParserState.PacketBody:
  63. {
  64. if (this.buffer.Length < this.packetSize)
  65. {
  66. return false;
  67. }
  68. MemoryStream memoryStream = new MemoryStream(this.packetSize);
  69. this.buffer.Read(memoryStream, this.packetSize);
  70. //memoryStream.SetLength(this.packetSize - Packet.MessageIndex);
  71. this.MemoryStream = memoryStream;
  72. if (this.service.ServiceType == ServiceType.Inner)
  73. {
  74. memoryStream.Seek(Packet.MessageIndex, SeekOrigin.Begin);
  75. }
  76. else
  77. {
  78. memoryStream.Seek(Packet.OpcodeLength, SeekOrigin.Begin);
  79. }
  80. this.state = ParserState.PacketSize;
  81. return true;
  82. }
  83. default:
  84. throw new ArgumentOutOfRangeException();
  85. }
  86. }
  87. }
  88. }
  89. }