NetworkManager.ReceiveState.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using System;
  8. using System.IO;
  9. namespace GameFramework.Network
  10. {
  11. internal sealed partial class NetworkManager : GameFrameworkModule, INetworkManager
  12. {
  13. private sealed class ReceiveState : IDisposable
  14. {
  15. private const int DefaultBufferLength = 1024 * 64;
  16. private MemoryStream m_Stream;
  17. private IPacketHeader m_PacketHeader;
  18. private bool m_Disposed;
  19. public ReceiveState()
  20. {
  21. m_Stream = new MemoryStream(DefaultBufferLength);
  22. m_PacketHeader = null;
  23. m_Disposed = false;
  24. }
  25. public MemoryStream Stream
  26. {
  27. get
  28. {
  29. return m_Stream;
  30. }
  31. }
  32. public IPacketHeader PacketHeader
  33. {
  34. get
  35. {
  36. return m_PacketHeader;
  37. }
  38. }
  39. public void PrepareForPacketHeader(int packetHeaderLength)
  40. {
  41. Reset(packetHeaderLength, null);
  42. }
  43. public void PrepareForPacket(IPacketHeader packetHeader)
  44. {
  45. if (packetHeader == null)
  46. {
  47. throw new GameFrameworkException("Packet header is invalid.");
  48. }
  49. Reset(packetHeader.PacketLength, packetHeader);
  50. }
  51. public void Dispose()
  52. {
  53. Dispose(true);
  54. GC.SuppressFinalize(this);
  55. }
  56. private void Dispose(bool disposing)
  57. {
  58. if (m_Disposed)
  59. {
  60. return;
  61. }
  62. if (disposing)
  63. {
  64. if (m_Stream != null)
  65. {
  66. m_Stream.Dispose();
  67. m_Stream = null;
  68. }
  69. }
  70. m_Disposed = true;
  71. }
  72. private void Reset(int targetLength, IPacketHeader packetHeader)
  73. {
  74. if (targetLength < 0)
  75. {
  76. throw new GameFrameworkException("Target length is invalid.");
  77. }
  78. m_Stream.Position = 0L;
  79. m_Stream.SetLength(targetLength);
  80. m_PacketHeader = packetHeader;
  81. }
  82. }
  83. }
  84. }