NetPacket.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA_8_1
  2. using System;
  3. using FlyingWormConsole3.LiteNetLib.Utils;
  4. namespace FlyingWormConsole3.LiteNetLib
  5. {
  6. internal enum PacketProperty : byte
  7. {
  8. Unreliable, //0
  9. Reliable, //1
  10. Sequenced, //2
  11. ReliableOrdered, //3
  12. AckReliable, //4
  13. AckReliableOrdered, //5
  14. Ping, //6
  15. Pong, //7
  16. ConnectRequest, //8
  17. ConnectAccept, //9
  18. Disconnect, //10
  19. UnconnectedMessage, //11
  20. NatIntroductionRequest, //12
  21. NatIntroduction, //13
  22. NatPunchMessage, //14
  23. MtuCheck, //15
  24. MtuOk, //16
  25. DiscoveryRequest, //17
  26. DiscoveryResponse, //18
  27. Merged //19
  28. }
  29. internal sealed class NetPacket
  30. {
  31. private const int LastProperty = 19;
  32. //Header
  33. public PacketProperty Property
  34. {
  35. get { return (PacketProperty)(RawData[0] & 0x7F); }
  36. set { RawData[0] = (byte)((RawData[0] & 0x80) | ((byte)value & 0x7F)); }
  37. }
  38. public ushort Sequence
  39. {
  40. get { return BitConverter.ToUInt16(RawData, 1); }
  41. set { FastBitConverter.GetBytes(RawData, 1, value); }
  42. }
  43. public bool IsFragmented
  44. {
  45. get { return (RawData[0] & 0x80) != 0; }
  46. set
  47. {
  48. if (value)
  49. RawData[0] |= 0x80; //set first bit
  50. else
  51. RawData[0] &= 0x7F; //unset first bit
  52. }
  53. }
  54. public ushort FragmentId
  55. {
  56. get { return BitConverter.ToUInt16(RawData, 3); }
  57. set { FastBitConverter.GetBytes(RawData, 3, value); }
  58. }
  59. public ushort FragmentPart
  60. {
  61. get { return BitConverter.ToUInt16(RawData, 5); }
  62. set { FastBitConverter.GetBytes(RawData, 5, value); }
  63. }
  64. public ushort FragmentsTotal
  65. {
  66. get { return BitConverter.ToUInt16(RawData, 7); }
  67. set { FastBitConverter.GetBytes(RawData, 7, value); }
  68. }
  69. //Data
  70. public readonly byte[] RawData;
  71. public int Size;
  72. public NetPacket(int size)
  73. {
  74. RawData = new byte[size];
  75. Size = 0;
  76. }
  77. public static bool GetPacketProperty(byte[] data, out PacketProperty property)
  78. {
  79. byte properyByte = (byte)(data[0] & 0x7F);
  80. if (properyByte > LastProperty)
  81. {
  82. property = PacketProperty.Unreliable;
  83. return false;
  84. }
  85. property = (PacketProperty)properyByte;
  86. return true;
  87. }
  88. public static int GetHeaderSize(PacketProperty property)
  89. {
  90. return IsSequenced(property)
  91. ? NetConstants.SequencedHeaderSize
  92. : NetConstants.HeaderSize;
  93. }
  94. public int GetHeaderSize()
  95. {
  96. return GetHeaderSize(Property);
  97. }
  98. public byte[] GetPacketData()
  99. {
  100. int headerSize = GetHeaderSize(Property);
  101. int dataSize = Size - headerSize;
  102. byte[] data = new byte[dataSize];
  103. Buffer.BlockCopy(RawData, headerSize, data, 0, dataSize);
  104. return data;
  105. }
  106. public bool IsClientData()
  107. {
  108. var property = Property;
  109. return property == PacketProperty.Reliable ||
  110. property == PacketProperty.ReliableOrdered ||
  111. property == PacketProperty.Unreliable ||
  112. property == PacketProperty.Sequenced;
  113. }
  114. public static bool IsSequenced(PacketProperty property)
  115. {
  116. return property == PacketProperty.ReliableOrdered ||
  117. property == PacketProperty.Reliable ||
  118. property == PacketProperty.Sequenced ||
  119. property == PacketProperty.Ping ||
  120. property == PacketProperty.Pong ||
  121. property == PacketProperty.AckReliable ||
  122. property == PacketProperty.AckReliableOrdered;
  123. }
  124. //Packet contstructor from byte array
  125. public bool FromBytes(byte[] data, int start, int packetSize)
  126. {
  127. //Reading property
  128. byte property = (byte)(data[start] & 0x7F);
  129. bool fragmented = (data[start] & 0x80) != 0;
  130. int headerSize = GetHeaderSize((PacketProperty) property);
  131. if (property > LastProperty ||
  132. packetSize > NetConstants.PacketSizeLimit ||
  133. packetSize < headerSize ||
  134. (fragmented && packetSize < headerSize + NetConstants.FragmentHeaderSize))
  135. {
  136. return false;
  137. }
  138. Buffer.BlockCopy(data, start, RawData, 0, packetSize);
  139. Size = packetSize;
  140. return true;
  141. }
  142. }
  143. }
  144. #endif