WSDataFrame.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //------------------------------------------------------------------------------
  2. // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有
  3. // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权
  4. // CSDN博客:https://blog.csdn.net/qq_40374647
  5. // 哔哩哔哩视频:https://space.bilibili.com/94253567
  6. // Gitee源代码仓库:https://gitee.com/RRQM_Home
  7. // Github源代码仓库:https://github.com/RRQM
  8. // API首页:https://www.yuque.com/rrqm/touchsocket/index
  9. // 交流QQ群:234762506
  10. // 感谢您的下载和使用
  11. //------------------------------------------------------------------------------
  12. //------------------------------------------------------------------------------
  13. using System;
  14. using TouchSocket.Core;
  15. using TouchSocket.Sockets;
  16. namespace TouchSocket.Http.WebSockets
  17. {
  18. /// <summary>
  19. /// WebSocket数据帧
  20. /// </summary>
  21. public class WSDataFrame : IDisposable, IRequestInfo
  22. {
  23. private bool m_disposedValue;
  24. /// <summary>
  25. /// 是否为最后数据帧。
  26. /// </summary>
  27. public bool FIN { get; set; }
  28. /// <summary>
  29. /// 标识RSV-1。
  30. /// </summary>
  31. public bool RSV1 { get; set; }
  32. /// <summary>
  33. /// 标识RSV-2。
  34. /// </summary>
  35. public bool RSV2 { get; set; }
  36. /// <summary>
  37. /// 标识RSV-3。
  38. /// </summary>
  39. public bool RSV3 { get; set; }
  40. /// <summary>
  41. /// 数据类型
  42. /// </summary>
  43. public WSDataType Opcode { get; set; }
  44. /// <summary>
  45. /// 计算掩码
  46. /// </summary>
  47. public bool Mask { get; set; }
  48. /// <summary>
  49. /// 有效载荷数据长度
  50. /// </summary>
  51. public int PayloadLength { get; set; }
  52. /// <summary>
  53. /// 掩码值
  54. /// </summary>
  55. public byte[] MaskingKey { get; set; }
  56. /// <summary>
  57. /// 有效数据
  58. /// </summary>
  59. public ByteBlock PayloadData { get; set; }
  60. /// <summary>
  61. /// 构建数据
  62. /// </summary>
  63. /// <param name="byteBlock"></param>
  64. /// <param name="masked"></param>
  65. /// <returns></returns>
  66. public bool Build(ByteBlock byteBlock, bool masked)
  67. {
  68. if (PayloadData != null)
  69. {
  70. PayloadLength = PayloadData.Len;
  71. }
  72. else
  73. {
  74. PayloadLength = 0;
  75. }
  76. if (PayloadData == null)
  77. {
  78. return WSTools.Build(byteBlock, this, new byte[0], 0, 0);
  79. }
  80. return WSTools.Build(byteBlock, this, PayloadData.Buffer, 0, PayloadLength);
  81. }
  82. /// <summary>
  83. /// <inheritdoc/>
  84. /// </summary>
  85. /// <param name="disposing"></param>
  86. protected virtual void Dispose(bool disposing)
  87. {
  88. if (!m_disposedValue)
  89. {
  90. if (disposing)
  91. {
  92. // TODO: 释放托管状态(托管对象)
  93. }
  94. PayloadData?.Dispose();
  95. m_disposedValue = true;
  96. }
  97. }
  98. /// <summary>
  99. /// 析构函数
  100. /// </summary>
  101. ~WSDataFrame()
  102. {
  103. // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  104. Dispose(disposing: false);
  105. }
  106. /// <summary>
  107. /// <inheritdoc/>
  108. /// </summary>
  109. public void Dispose()
  110. {
  111. // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  112. Dispose(disposing: true);
  113. GC.SuppressFinalize(this);
  114. }
  115. }
  116. }